Qt:如何关闭用 exec() 打开的对话框窗口?
Posted
技术标签:
【中文标题】Qt:如何关闭用 exec() 打开的对话框窗口?【英文标题】:Qt: How to close a dialog window opened with exec()? 【发布时间】:2016-05-01 20:12:01 【问题描述】:我正在 Qt 中制作一个 c++ 应用程序,并且需要在某个函数完成执行后通过代码以编程方式关闭一个对话框窗口(使用 this->exec();
打开)。
我使用的是 Qt 5.6。
提前致谢!
这是我的代码示例,它不起作用(Worker
是对话框类):
void MainWindow::on_pushButton_2_clicked()
//When Start button clicked:
Worker worker;
worker.exec();
//worker.run(1);
worker.accept();
所以当点击pushButton_2
时,我希望打开一个对话框,显示当前进度,完成后,我希望它关闭。
【问题讨论】:
doc.qt.io/qt-4.8/qwidget.html#close @LogicStuff 我用了close()
,没用。
【参考方案1】:
编辑:
现在你发布了更多代码......
worker.exec();
worker.accept(); // or worker.close();
exec()
启动 QDialog
事件处理循环,并且仅在完成时返回(在调用 accept()
、reject()
或 done(int)
之后)。所以worker.accept()
将无法到达(如果使用调试器,您应该会看到)。它必须在用户操作后由worker
自己调用(按实例单击按钮)。
你的意思是:
worker.show();
QThread::sleep(2); // wait for 2 seconds
worker.accept();
然后,worker.accept()
将在某个时候执行。显示了对话框,但它是模态的。
旧帖(编辑前):
您可以调用accept()
来执行用户单击OK
或reject()
执行用户单击Cancel
的操作。
请注意,这些是slots
,因此您可以通过将signal
连接到它们来触发它们(例如,当您的函数完成执行时发出的信号)。
例子:
void MyDialog::doSomethingAndClose()
// do your stuff here
accept(); // will close the dialog
或:
void MyDialog::doSomethingAndClose()
// do your stuff here
emit weAreDone();
如果您之前已连接(例如在 MyDialog
构造函数中):
connect( this, SIGNAL(weAreDone()), this, SLOT(accept()) );
【讨论】:
@FlareCat:应该,除非你做错了什么。我很惊讶你会this->exec()
。您不是从类构造函数中调用它,是吗?您是否尝试过从班级外部调用exec()
(让实体如何创建对话框来调用它)。
@FlareCat:那么您需要发布更多代码。您没有发布足够的代码让我们提供帮助。你没有发布任何内容。一般规则是调用accept()
、reject()
或done()
来中断对话的exec()
循环。
好的,我编辑了我的问题以添加我的代码部分。给出的代码在我的mainwindow.cpp
。
好的,现在使用您的编辑:当我运行show
然后accept
时,函数运行,但窗口永远不会打开。用于启动该功能的按钮会保持突出显示一段时间,但随后会恢复正常。有什么想法吗?
@FlareCat:已编辑。尝试一下sleep
worker 应该会显示两秒钟。【参考方案2】:
只需将您的自定义信号与QDialog::done(int)
连接,并在您的函数执行完成后发出信号。
【讨论】:
我能举个简单的例子吗?我对 Qt 有点陌生,并且不太确定这意味着什么。 (我知道信号和槽。)【参考方案3】:正如我刚刚了解到的,这个问题是由于 gui 没有自动更新引起的。
Here 是解决此问题的 SO 问题的链接。
【讨论】:
以上是关于Qt:如何关闭用 exec() 打开的对话框窗口?的主要内容,如果未能解决你的问题,请参考以下文章
Qt 之 模态非模态半模态窗口的介绍及 实现QDialog的exec()方法
qt中如何创建2个窗口,点击窗口a上按钮打开窗口b,在b关闭前无法对a操作
Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)