在子创建后设置父时,子小部件对事件是透明的
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
作为主窗口中的基本布局。请注意,这不适用于QMainWindow
、QScrollArea
和没有直接应用容器布局的类似窗口。
QStackedWidget
作为基础小部件类,其中插入了您的 QMainWindow
或类似类。
在这两种情况下,您都会将设置窗口临时插入堆栈,然后翻页。
请注意,从用户体验的角度来看,这种行为是有问题的。
【讨论】:
我尝试使用 QStackedLayout,它工作正常,因为我的设置窗口是透明的,我使用了 setStackingMode(QStackedLayout::StackAll),它看起来和以前一样。感谢您的帮助。以上是关于在子创建后设置父时,子小部件对事件是透明的的主要内容,如果未能解决你的问题,请参考以下文章