我有一个带有两个顶级窗口的应用程序(即没有父窗口小部件),它们相互独立,我想让用户随时在他们之间切换。但是,当其中一个窗口通过调用dlg.exec()
打开模态对话框时,它也会阻止另一个窗口。用户根本无法切换到它。我设法使用dlg.setWindowModality(Qt::WindowModal)
然后dlg.show()
创建模态对话框,但他显示对话框并继续,而不等待对话框的返回值。因此,如果我想处理模态对话框的结果(通常查询某些信息 - 例如打开/保存文件对话框),我需要移动功能处理对话框结果的其他一些功能(除了打开对话框的功能)并使用ad hoc信号/插槽连接,一些回调或让对话本身知道如何处理结果,在我看来这是一个糟糕的设计。使用文件对话框或QMessageBox
...
所以我的问题是:在Qt中是否有任何技巧可以让我拥有两个顶级窗口,用户可以自由切换,同时可以打开模态对话框,如dlg.exec()
,它只会阻塞一个窗口并等待对话框结果,但不阻止其他窗口?我认为这是不可能的,但也许我错过了一些东西。我的意思是例如一些带有线程的魔法和我不知道的QEventLoop
?据我所知,小部件必须驻留在主线程中,如果我想使用线程,这在这种情况下有点麻烦......
答案 0 :(得分:0)
使用QDialog::exec()
。
这是一个有效的例子:
<强>的main.cpp 强>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
MainWindow w2;
w2.show();
return a.exec();
}
<强> mainwindow.cpp 强>
// I skipped the rest of the code as it is just the template code from Qt Creator template project.
void MainWindow::on_pushButton_clicked() // mainwindow.ui creates a QPushButton named "pushButton"
{
QMessageBox mb(this);
mb.setModal(true);
mb.setWindowModality(Qt::WindowModal);
mb.exec();
}
它会打开2个窗口,我可以独立地与它们进行交互,无论对方是否打开了QMessageBox。