其中一个窗口中有多个顶级窗口和模态对话框,而不会阻挡另一个窗口

时间:2017-07-07 13:53:02

标签: qt

我有一个带有两个顶级窗口的应用程序(即没有父窗口小部件),它们相互独立,我想让用户随时在他们之间切换。但是,当其中一个窗口通过调用dlg.exec()打开模态对话框时,它也会阻止另一个窗口。用户根本无法切换到它。我设法使用dlg.setWindowModality(Qt::WindowModal)然后dlg.show()创建模态对话框,但他显示对话框并继续,而不等待对话框的返回值。因此,如果我想处理模态对话框的结果(通常查询某些信息 - 例如打开/保存文件对话框),我需要移动功能处理对话框结果的其他一些功能(除了打开对话框的功能)并使用ad hoc信号/插槽连接,一些回调或让对话本身知道如何处理结果,在我看来这是一个糟糕的设计。使用文件对话框或QMessageBox ...

等内置对话框尤其困难

所以我的问题是:在Qt中是否有任何技巧可以让我拥有两个顶级窗口,用户可以自由切换,同时可以打开模态对话框,如dlg.exec() ,它只会阻塞一个窗口并等待对话框结果,但不阻止其他窗口?我认为这是不可能的,但也许我错过了一些东西。我的意思是例如一些带有线程的魔法和我不知道的QEventLoop?据我所知,小部件必须驻留在主线程中,如果我想使用线程,这在这种情况下有点麻烦......

PS:让你更好地了解我需要的东西,在一个窗口中想象Excel,在另一个窗口想象它的VB编辑器。用户可以随时切换到VB。

1 个答案:

答案 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。