在exec()之后,窗口模式QFileDialog将父级推送到后台

Window modal QFileDialog pushing parent to background after exec()

本文关键字:后台 QFileDialog 模式 exec 之后 窗口      更新时间:2023-10-16

我把我的问题归结为必要的,所以不要介意它没有任何用处,如图所示。

我有我的MainWindow,它是一个内部有QPushButtonQMainWindow,我将该按钮的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();
}

一切都很好,直到我有两个或更多的MainWindow在玩。然后,在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回到了前面,但你可以看到窗口在短暂地切换位置。

我通过谷歌、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

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