在子创建后设置父时,子小部件对事件是透明的

Posted

技术标签:

【中文标题】在子创建后设置父时,子小部件对事件是透明的【英文标题】:A child widget is transparent to events when parent is set after child creation 【发布时间】:2013-09-11 12:14:17 【问题描述】:

我有一个 qt 应用程序,它由一个主窗口和一个设置窗口组成,我正在尝试移植到 Qt5。

我使用QWidget::setParent() 将我的设置窗口完全设置在(并覆盖)我的主窗口的顶部,并且在使用 qt5.1.1(我使用的以前的版本是 qt 4.8.5)之前,这种方法效果很好。

我现在遇到的问题是设置窗口显示正确,但几乎所有鼠标事件(减去某些按钮上的鼠标)都直接传递到下面的主窗口。

我尝试为设置窗口设置不同的标志,但没有效果。

此问题不会在 Windows 上重现。

我一直在寻找解决这个问题的方法。

我在 MacOSX 10.7.5 上使用 qt 5.1.1

【问题讨论】:

我相信当您将小部件设置为窗口的子窗口时,您会将其添加到窗口的布局中。所以事件会先到父窗口,然后再到小部件。 @headsvk 奇怪的是它在 Windows 或以前版本的 Qt4 上工作正常。我意识到我的设置窗口正在添加到布局中,但我仍然认为它应该首先获取事件,因为它位于主窗口之上。我认为这可能是 Qt 中的一个错误。 【参考方案1】:

您的问题在于兄弟姐妹重叠。当您重新设置设置窗口时,它在主窗口内具有与其重叠的各种同级。正如您刚刚了解到的,这似乎具有未定义的行为。您的窗口不会仅仅通过重新设置父项添加到任何布局中。如果添加到布局中(堆叠布局除外),就不会出现这个问题,当然看起来也不对。

便携式解决方案将涉及使用:

    QStackedLayout 作为主窗口中的基本布局。请注意,这不适用于QMainWindowQScrollArea 和没有直接应用容器布局的类似窗口。

    QStackedWidget 作为基础小部件类,其中插入了您的 QMainWindow 或类似类。

在这两种情况下,您都会将设置窗口临时插入堆栈,然后翻页。

请注意,从用户体验的角度来看,这种行为是有问题的。

【讨论】:

我尝试使用 QStackedLayout,它工作正常,因为我的设置窗口是透明的,我使用了 setStackingMode(QStackedLayout::StackAll),它看起来和以前一样。感谢您的帮助。

以上是关于在子创建后设置父时,子小部件对事件是透明的的主要内容,如果未能解决你的问题,请参考以下文章

在子小部件中,如何在 kivy 中获取父小部件的实例

如何在 Flutter 中正确重用 Provider

Qt半透明背景导致子小部件在父小部件中“印记”

QGridLayout 不会返回其所有子小部件

处理父小部件和子小部件上的鼠标事件(按钮不消耗事件?)

Kivy 如何访问子小部件中的小部件