如何从另一个 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 类的主要内容,如果未能解决你的问题,请参考以下文章

QT QML - 从另一个类访问 qml 模型

从另一个 .java 类调用 onClick 函数

如何让 Qt Widget 填充父 Widget?

如何从另一个表单调用表单?

当 MainWindow 从另一个类(不在主函数中)启动时,QT ui 未显示

如何从另一个 dart 文件中调用有状态小部件(有表单)方法?- Flutter