在 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 上的渲染问题 - 是啥原因造成的,如何解决?

如何在 QGraphicsScene 中缩放图像? (Qt 5.11)

如何在 Qt 中获取鼠标在屏幕上的位置?

Qt文档阅读笔记-Qt for Linux/X11 - Building from Source