问:如何关闭用exec()打开的对话框窗口?

时间:2016-05-01 20:12:01

标签: c++ qt

我正在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时,我想要打开一个对话框,显示当前进度,完成后,我希望它关闭。

3 个答案:

答案 0 :(得分:4)

修改

现在你发布了更多代码......

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(),就像用户点击OKreject()一样,就像用户点击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()) );

答案 1 :(得分:0)

只需将自定义信号与QDialog::done(int)连接,并在函数执行完毕后发出信号。

答案 2 :(得分:0)

正如我刚刚了解到的那样,问题是gui没有自动更新引起的。

Here是修复此问题的SO问题的链接。