【问题标题】:Window modal QFileDialog pushing parent to background after exec()在 exec() 之后,窗口模式 QFileDialog 将父级推到后台
【发布时间】:2013-08-01 15:51:44
【问题描述】:

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

我有我的MainWindow,它是一个QMainWindow,里面有一个QPushButton,我将该按钮的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

【问题讨论】:

    标签: c++ qt qfiledialog


    【解决方案1】:

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

    【讨论】:

    • 那么问题不会发生,但我不希望 FileDialog 成为应用程序模式。我希望它是窗口模式(特别是因为这会导致 Mac 上的工作表对话框)。
    猜你喜欢
    • 2020-04-01
    • 2016-05-26
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多