如何使QDialog只对其非模态父窗口进行模态处理,而不是对所有祖父窗口进行模态处理?

时间:2018-03-07 14:15:38

标签: qt

我正在进行的项目需要一个非模态对话框(让我们称之为对话框“A”),弹出另一个对话框(让我们称之为对话框“B”),这将是一个模态,但仅限于其父级(对话框“A”)。因此,当弹出对话框“B”时,它应仅阻止对话框“A”,而不应阻止GUI的其余部分。主窗口是对话框“A”的父级,而对话框“A”是对话框“B”的父级,并且这些父子关系不能更改。

有没有人知道如何实现这一目标?

我试图依靠Qt::WindowModality属性来实现这一目标。对于对话框“A”,它设置在Qt::NonModal值,而对于“B”,它设置在Qt::WindowModal一个。通过调用QWidget :: show()弹出这两个对话框,但是当显示对话框“B”时,它会阻止主窗口和对话框“A”。主窗口被阻止,整个GUI实际上被阻塞,这与我们的要求相冲突。

根据Qt::WindowModality属性的Qt文档,我们刚刚面对的行为是预期的,因为在那里声明Qt::WindowModal值使其父窗口和所有祖父母窗口的窗口模态。在我看来,无论父子链中的某个窗口是非模态窗口,这个为所有祖父母制作窗口模态的特征似乎都缺乏Qt::WindowModality属性的逻辑。在显示为非模态链的第一个父/祖父母之后,打破这个循环是合乎逻辑的。

1 个答案:

答案 0 :(得分:0)

我在项目中遇到了这个问题,在近一个研究周中发现的最佳解决方法是使用以下方法禁用父窗口:

parent.setEnable(false);

但是此方法会影响小部件和所有子项[1],因此您需要在显示窗口之前启用所有子项:

child.setEnabled(true); 
child.show();

主要缺点是,您可以关闭父窗口,但是如果从窗口小部件继承,则可以覆盖关闭按钮的方法,并在关闭前检查是否使用isEnabled()启用。