在 Linux/X11 上的 Qt 中,如何解决主窗口排序问题?
Posted
技术标签:
【中文标题】在 Linux/X11 上的 Qt 中,如何解决主窗口排序问题?【英文标题】:In Qt on Linux/X11, how do I fix main window ordering issue? 【发布时间】:2011-10-14 13:59:24 【问题描述】:我有一个有两个主窗口的 Qt 应用程序。在 Linux 上,当一个主窗口弹出一个模态对话框时,它会出现在另一个主窗口的后面。我该怎么做才能使对话框始终出现在所有主窗口的顶部?
注意:这只发生在 Linux 上。我们也在 MacOSX 上构建了这个应用程序,并且没有出现问题。
这是调出对话框的代码。 #if 中的内容是我试图将窗口向前推进的所有内容。我尝试了这些东西的各种组合和顺序。
QMessageBox dialog;
dialog.setIcon( QMessageBox::Information );
dialog.setWindowTitle( _documentName );
dialog.setText( tr("This document has unsaved changes. Do you want to save before closing?") );
dialog.setInformativeText( tr("Your changes will be lost if you don't save them.") );
dialog.setStandardButtons( QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel );
dialog.setDefaultButton( QMessageBox::Save );
dialog.setFixedSize( dialog.size() ); // non-resizable window
#if STUFF_I_TRIED
dialog.show();
dialog.setVisible(true);
dialog.open();
dialog.activateWindow();
dialog.raise();
#endif
int result = dialog.exec();
我意识到 exec() 应该是显示窗口所需的全部内容。我调用 show() 或 open() 的想法只是让 activateWindow() 或 raise() 生效。只是胡闹,试图让那个该死的对话站出来。
TIA 寻求帮助!
【问题讨论】:
对不起。我忽略了显示我用来实际显示窗口的 dialog.exec() 调用。请理解:#if 中的内容仅用于说明目的,以显示我一直在尝试的各种事情。我的理解是我不应该需要这些...... exec() 应该做所有正确的事情。 您能否提供代码摘录,何时以及如何创建两个主窗口?其中一个应该是父母,对吧? 安德烈斯,你是对的!!!就是这样!我错过了这个对话框没有父级的事实。当我将父窗口传递给对话框的构造函数时,一切都很好......然后对话框出现在两个窗口上。我想我可能会遗漏一些基本的东西。非常感谢你让我的大脑如此兴奋。 【参考方案1】:#if 1_ 和 #endif 之间的所有顺序对我来说看起来很奇怪。 通常,要显示模态对话框,只需要exec():
QMessageBox msgBox;
msgBox.setText("They killed Kenny, again.");
int ret = msgBox.exec();
Reference.
【讨论】:
对不起。你是绝对正确的。我不清楚#if 中的内容是什么。我已经修改了问题文本。 Andrejs 给了我线索,让我可以解决这个问题。我没有将父窗口传递给对话框的构造函数。这样做解决了问题。 Andrejs 提到了这一点作为对原始问题的评论(见上文),但我将通过他的这个回答给予他信任。谢谢安德烈斯!【参考方案2】:您在#if 1 之间做了很多事情,这可能会让 X11 感到困惑。
您只需要其中一个。由于您使用的是 Mac 和 X11,我怀疑您想使用 open() 并获得一张工作表。
IIRC,show() 与 open() 会导致设置不同的窗口标志,因此 一个接一个地叫他们可能会让窗户变成一个奇怪的地方 状态。如果它是一个对话框,那么调用 show() 或 open() 应该总是激活或提升窗口,QMessageBox 就是。
尝试只使用其中一种,看看会发生什么。
【讨论】:
抱歉,我最初对问题的表述不够清楚。我试过只调用 show() 或 open(),但只是希望它们可能导致调用 raise() 或 activateWindow() 产生预期的效果。我的真实代码(在#if 之外)没有这些。以上是关于在 Linux/X11 上的 Qt 中,如何解决主窗口排序问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?
如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置
Qt5.2.1,.2.0 OSX Mavericks 上的渲染问题 - 是啥原因造成的,如何解决?