UI元素在以编程方式打开的QWidget上被阻止

时间:2014-07-02 05:36:39

标签: qt qwidget qdialog

MainWindow继承自QMainWindow。还有从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时单击托盘通知,则会在SettingsDialog前面打开ReadWindow。用户可以激活ReadWindow,但是当SettingsDialog打开时,ReadWindow中的所有UI元素(例如所有按钮)都被阻止(即按钮不可点击)。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

<强>更新

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

也许你可以使用Qwidget:raise()将SettingsDialog带回到前面。另一种解决方案是设置标志并在关闭“设置”对话框后打开“阅读器”窗口。

但是我会尽量避免这种不常见的行为。当然没有更多的inintitive GUI设计?

答案 1 :(得分:0)

试试这个:

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

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

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

settingsDialog: 该窗口是单个窗口层次结构的模态,并阻止输入到其父窗口,所有祖父窗口以及其父窗口和祖父窗口的所有兄弟窗口。

readwindow: 不是Maindialog的孩子,因此不会被阻止。

希望有帮助...