如何从另一个 Qt Widget 表单类调用 MainWindow 类
Posted
技术标签:
【中文标题】如何从另一个 Qt Widget 表单类调用 MainWindow 类【英文标题】:How to call MainWindow class from another Qt Widget form class 【发布时间】:2018-01-31 17:49:56 【问题描述】:我想在我的程序启动时显示一个对话框,为此我创建了一个名为Dialog
的新Qt Designer 表单类。
在 main.cpp 我有以下代码执行 Dialog
类:
int main(int argc, char *argv[])
QApplication a(argc, argv);
Dialog diag ;
diag.show() ;
return a.exec();
Dialog
类包含一个“确定”按钮。当用户按下该按钮时,对话窗口关闭,MainWindow
打开。为此,我将其编码如下:
void Dialog::on_ok_butt_clicked()
MainWindow w ;
w.show() ;
但 MainWindow 窗口未显示... 我怎么解决这个问题?
【问题讨论】:
将MainWindow w ; w.show();
更改为MainWindow* w= new MainWindow; w->show();
嗨 ... tnx 的回复... 你能告诉我区别
函数结束时会破坏局部变量,因此您的窗口将被删除。另一方面,如果你存储记忆的位置,它会保留下来,但你的职责是当你不需要它时,你必须消除它。
我可以在 main 或某些 header extern 方式中声明它以用于父子目的,并且在 ok_push_buuton 插槽中只调用 show() 吗?正如卡南所提议的那样,这样处理不是很好吗?
@eyllanesc,没问题。大多数 qt 新程序员都不知道良好的设计实践..这就是为什么我没有在我的答案中包含代码..
【参考方案1】:
您在对象生命周期中的问题。在 on_ok_butt_clicked() 您创建 MainWindow 对象。从 on_ok_butt_clicked() 返回后,MainWindow 对象将被销毁。
您需要创建一个对象,以便在退出 on_ok_butt_clicked() 方法后它仍然存在。另一种选择是在显示对话框时停止执行该方法(这不适用于 QMainWindow,因为 QMainWindow 继承自 QWidget,而不是 QDialog)。 第一个解决方案:
MainWindow *w = new MainWindow(this);
w->show();
第二种解决方案:
SomeDialog w;
w.exec();
【讨论】:
MainWindow 没有 exec 方法。 哦,我错了。 MainWindow 继承自 QWidget,而不是 QDialog。 编辑您的问题并改进它。【参考方案2】:在你的方式中,对话框对象是你的主窗口的父级,这不是一个好的设计,因为对话框通常是一个临时对象,而主窗口将是你的主 UI,所以我更喜欢在你的主窗口中创建对话框,当你想首先显示对话框hide()
主窗口,不要忘记accept()
或reject()
你的对话框
【讨论】:
好吧...我对此进行测试...但是当我添加以下对话框诊断时; diag.show() 什么也没发生以上是关于如何从另一个 Qt Widget 表单类调用 MainWindow 类的主要内容,如果未能解决你的问题,请参考以下文章