3

我将我的问题简化为必要的问题,所以不要介意这没有任何用处,如此处所示。

我有MainWindow一个QMainWindow带有QPushButton内部的 a,我clicked()将该按钮的信号连接到以下插槽QMainWindow

void MainWindow::followingSlot()
{
    OpenFileDialog(this);
}

OpenFileDialog是一个自由函数:

void OpenFileDialog(QWidget * inParent)
{
    QFileDialog dialog(inParent, "caption");
    dialog.setFileMode(QFileDialog::ExistingFiles);
    dialog.setWindowModality(Qt::WindowModal);
    dialog.exec();
}

一切正常,直到我有 2 个或更多MainWindows 在玩。然后,在QFileDialog::exec()调用结束时,当前MainWindow被推回“焦点堆栈”中的一个位置,MainWindow第二个被激活并跳转到前台。我希望处于活动状态且位于前面的窗口保持活动状态且位于前面。

我当然可以适应OpenFileDialog以下情况:

void OpenFileDialog(QWidget * inParent)
{
    QFileDialog dialog(inParent, "caption");
    dialog.setFileMode(QFileDialog::ExistingFiles);
    dialog.setWindowModality(Qt::WindowModal);
    dialog.exec();
    inParent->raise();
    inParent->activateWindow();
}

这让我MainWindow回到了前面,但你可以看到窗户短暂地切换了位置。

我通过 Google、QtCentre 或 SO 没有发现类似的问题。有没有办法阻止这种行为并将注意力集中在MainWindow有焦点的事情上?

我在 Mac 上使用 Qt 4.8。

编辑: 我发现不是当前MainWindow被推回,而是MainWindow堆栈中的第二个被拉到前面。如果我从左边的堆栈开始,我将以右边的堆栈结束(顶部在前面,底部在后面):

current MainWindow    other MainWindow   raise() current MainWindow
other application  -> current MainWindow ------> other MainWindow
other MainWindow      other application          other application
4

1 回答 1

0

您是否尝试将模态设置为 Qt::ApplicationModal。这样,FileDialog 对整个应用程序都是模态的,而不仅仅是父窗口。

于 2013-08-01T15:59:03.533 回答