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交互
答案 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的孩子,因此不会被阻止。
希望有帮助...