【问题标题】:UI element are blocked on programmatically opened QWidgetUI 元素在以编程方式打开的 QWidget 上被阻止
【发布时间】:2014-07-02 05:36:38
【问题描述】:

有一个继承自 QMainWindow 的 MainWindow。并且有从 QDialog 继承的 SettingsDialog。在 MainWindow 中,用户可以通过单击“设置”按钮将 SettingsDialog 作为模式对话框打开。

void MainWindow::showSettingsDialog()
{
    SettingsDialog settingsDialog(this);
    settingsDialog.exec();
}

应用有托盘通知。如果用户点击通知 ReadWindow(继承自 QWidget)将作为非模态窗口打开。

void MainWindow::onTrayMessageClicked()
{
    activateWindow();
    ReadWindow *readWindow = new ReadWindow(this);
    readWindow->show();
}

现在,如果用户在打开 SettingsDialog 时单击托盘通知,ReadWindow 将在 SettingsDialog 前面打开。用户可以激活 ReadWindow,但在 SettingsDialog 打开时,ReadWindow 中的所有 UI 元素(例如所有按钮)都被阻止(即按钮不可点击)。

如何在 SettingsDialog 下打开 ReadWindow 并且用户不能选择它(因为 SettingsDialog 是模态的)?

编辑:我的目标是:在任何其他模式窗口下打开 ReadWindow,用户在关闭所有模式窗口之前不得与 ReadWindow 交互

【问题讨论】:

  • 我尝试从 settingsDialog 调用 void QWidget::raise()。它将 SettingsDialog 置于最前面,但仍可以激活 ReadWindow。
  • 感谢您的建议。但我还没有解决问题。所以还在等待帮助。

标签: qt qwidget qdialog


【解决方案1】:

试试这个:

void MainWindow::showSettingsDialog()
{
    SettingsDialog settingsDialog(this);
    settingsDialog.setWindowModality(Qt::WindowModal);
    settingsDialog.show();
}

void MainWindow::onTrayMessageClicked()
{
    activateWindow();
    ReadWindow *readWindow = new ReadWindow();
    readWindow->show();
}

来自文档: 对话框可以是应用程序模式(默认)或窗口模式。

设置对话框: 窗口对于单个窗口层次结构是模态的,并阻止对其父窗口、所有祖父窗口以及其父窗口和祖父窗口的所有兄弟窗口的输入。

阅读窗口: 不是 Maindialog 的子项,因此不会被阻止。

希望对您有所帮助...

【讨论】:

  • 是的,您的回答解除了对 UI 元素的阻止。但我的问题是:如何在 SettingsDialog 下打开 ReadWindow 并且用户不能选择它(相对于 ReadWindow 也做 SettingsDialog 模态)?
【解决方案2】:

为什么要让设置对话框变成模态?有什么特殊原因吗?如果可能,将设置对话框设为非模式。

无论如何,您的 ReadWindow 应该将 SettingsDialog 作为父级,而不是 MainWindow。目前,您正在将 this (即 MainWindow)传递给 ReadWindow 的构造函数,该构造函数未反映所需的顺序。也许这也解决了你的模态问题。

更新

现在我明白你想要实现的目标了。

也许您可以使用 Qwidget:raise() 将 SettingsDialog 重新置于前面。另一种解决方案可能是设置一个标志并在设置对话框关闭后打开阅读器窗口。

不过,我会尽量避免这种不常见的行为。确定没有更直观的 GUI 设计?

【讨论】:

  • App 的逻辑需要做 SettingsDialog 作为模态。所以我不能不模态。
  • ReadWindow 和 SettingsDialog 窗口相互独立。如果我将 SettingDialog 设置为 ReadWindow 的父级,则当用户关闭 SettingsDialog ReadWindow 时也会关闭。它不应该。
  • 我不认为他们是独立的。如果 GUI 被锁定,SettingsDialog 将打开 ReadDialog 而其余部分。这实际上意味着 Read 是 Settings 的一种子项。视觉/用户端的顺序应该对应于逻辑/对象端的顺序。否则您将遇到上述问题。
  • 试试我的建议,告诉我它是否能解决模态问题。
  • 我尝试了你的建议。正如我所说,ReadWindow 必须在关闭 SettingsDialog 后保留。我只想将 SettingsDialog 作为 ReadWindow 的模式。所以你的建议没有解决模态问题。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 2020-02-09
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2015-12-11
相关资源
最近更新 更多