• 12591阅读
  • 14回复

[提问]新建的Qt设计师界面类的构造函数中如何调用主窗口中的函数? [复制链接]

上一主题 下一主题
离线naruto
 

只看楼主 正序阅读 楼主  发表于: 2012-03-07
关键词: 求助多窗口
rt
Qt GUI应用项目
---头文件
-------mainwindow.h
-------dialog.h
---源文件
-------mainwindow.cpp
-------dialog.cpp
-------main.cpp

在mainwindow.h中申明函数Load();请问如何才能在dialog.cpp中对函数Load()进行调用?
求各位帮忙
离线dxfans

只看该作者 14楼 发表于: 2012-03-08
Re:回 12楼(dxfans) 的帖子
引用第13楼naruto于2012-03-08 13:43发表的 回 12楼(dxfans) 的帖子 :
在Dialog的构造函数中使用
MainWindow *obj = qobject_cast<MainWindow*>(this->parentWidget());
能够得到父对象,但是不能调用MainWindow类中的public变量
例如,在MainWindow中public申明QSqlTableModel *model;
.......

1、MainWindow头文件加了没
2、QSqlTableModel *model指针赋值了没
如果这两个都做了,那就没问题了;你自己检查下
离线naruto

只看该作者 13楼 发表于: 2012-03-08
回 12楼(dxfans) 的帖子
在Dialog的构造函数中使用
MainWindow *obj = qobject_cast<MainWindow*>(this->parentWidget());
能够得到父对象,但是不能调用MainWindow类中的public变量

例如,在MainWindow中public申明QSqlTableModel *model;
在Dialog构造函数中使用ui->tableview->setmodel(obj->model);
会出现内存不能“read”的提示,虽然得到了父类指针,但是不能用

请问这样该如何处理?
离线dxfans

只看该作者 12楼 发表于: 2012-03-08
回 11楼(naruto) 的帖子
你转换下即可了;
Dialog的构造函数中有个参数QWidget * parent ,这个就代表Dialog的父对象,即MainWindow窗口
离线naruto

只看该作者 11楼 发表于: 2012-03-07
回 9楼(dxfans) 的帖子
parentWidget()返回的事QWidget型的指针,并不是mainwindow指针啊
离线wxj120bw

只看该作者 10楼 发表于: 2012-03-07
回 8楼(naruto) 的帖子
  1. ChildDialog::ChildDialog(QWidget *parent,  MainWindow *mainWindow) :
  2.     QDialog(parent),
  3.     ui(new Ui::ChildDialog),_mainWindow(mainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint);
  7.     _mainWindow->Warning();
  8. }

PS:没有理解我的意思 建议看点C++书
离线dxfans

只看该作者 9楼 发表于: 2012-03-07
回 楼主(naruto) 的帖子
mainwindow是dialog的父对象;所以在dialog.cpp中使用parentWidget()函数即可获得mainwindow指针了,这样你就可以调用Load()函数了
离线naruto

只看该作者 8楼 发表于: 2012-03-07
回 7楼(wxj120bw) 的帖子
mainwin.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "childdialog.h"
#include "depmanage.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void Warning();
private:
    Ui::MainWindow *ui;
    Dialog mydialog;
};

#endif // MAINWINDOW_H
、、、、、、、、、、、、、、、、、、、、、、、、、、、、
主窗口建好后,新建Qt设计师界面类,选择dialog
dialog.h文件和dialog.cpp文件自动生成

、、、、、、、、、、、、、、、、、、、、、、、
dialog.cpp文件
#include "childdialog.h"
#include "ui_childdialog.h"
#include "mainwindow.h"

ChildDialog::ChildDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ChildDialog)
{
    ui->setupUi(this);
    setWindowFlags(Qt::Dialog | Qt::WindowMinMaxButtonsHint);
    MainWindow obj;
    obj.Warning();

}

ChildDialog::~ChildDialog()
{
    delete ui;
}
这样写的话没有显示错误,但是程序执行占用cpu99%左右,估计是内存泄露了


离线wxj120bw

只看该作者 7楼 发表于: 2012-03-07
回 6楼(naruto) 的帖子
把代码上传下吧
离线naruto

只看该作者 6楼 发表于: 2012-03-07
回 5楼(wxj120bw) 的帖子
真囧。。。
头文件是写了的,因为我的MainWindow类定义中申明了一个Dialog类对象的,所以mainwindow.h文件中包含了头文件“dialog.h”。。。
再加头文件的话就是dialog.h文件中有含有头文件“mainwindow.h”了,这样还是有错误的
离线wxj120bw

只看该作者 5楼 发表于: 2012-03-07
回 4楼(naruto) 的帖子
错误时头文件没有包含
PS:我始终说的是一种方法
离线naruto

只看该作者 4楼 发表于: 2012-03-07
回 3楼(wxj120bw) 的帖子
请问该如何传递MainWindow对象指针给Dialog类的对象?
ps:你说的第一种方法执行后程序没有错误,但是运行后主窗口不显示出来,而是隐藏在后台,只有在任务管理器中才能看到;而第二种方法,刚才试了,反而提示有错误,MainWindow *obj,错误:ISO C++ forbids declaration of 'MainWindow' with no type,可能是我理解错了
离线wxj120bw

只看该作者 3楼 发表于: 2012-03-07
回 2楼(naruto) 的帖子
在Dialog类定义MainWindow *obj指针对象,在Dialog类构造时,传递MainWindow对象指针给Dialog类的对象 这样在Dialog对象就可以调用MainWindow的函数了。
离线naruto

只看该作者 2楼 发表于: 2012-03-07
回 1楼(wxj120bw) 的帖子
你的意思是说在dialog类中加如MainWindow obj;
obj.Load();然后直接这么调用吗?
我这么试过,还是出错
我在mainwindow类中定义了一个dialog对象,因为是点击主窗口上的一个按钮,然后弹出dialog类窗口
离线wxj120bw

只看该作者 1楼 发表于: 2012-03-07
回 楼主(naruto) 的帖子
dialog类定义mainwindow类型的成员对象 构造dialog类传递mainwindow对象 这样就可以调用Load函数
快速回复
限100 字节
 
上一个 下一个