QLayout 中的重叠小部件

Posted

技术标签:

【中文标题】QLayout 中的重叠小部件【英文标题】:Overlapping widgets in QLayout 【发布时间】:2018-02-28 12:37:39 【问题描述】:

我想创建一个窗口,后面是Qt3DWindow,上面是一些QPushButtons。然而,只显示Qt3DWindow 动画,而看不到QPushButtons。我也想拥有Qt3DWindow 功能和QPushButtons (所以我可以点击后面的按钮或3D 动画)。仅当我将 Qt3DWindow 透明度设置为较低值时,才能看到按钮。当然,在这种情况下,按钮只能看到,但没有功能。

class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)

        self.window = Window()  # Qt3DExtras.Qt3DWindow
        self.container = self.createWindowContainer(self.window)

        self.buttons = Buttons()
        self.layout().addWidget(self.buttons.view)  # QtWidgets.QGraphicsView
        self.layout().addWidget(self.container)

【问题讨论】:

QMainWindow 有自己专有的布局类型——您不能像使用任何其他布局一样简单地使用它。您需要将 Buttonscontainer 放在父 QWidget 下,并将 that 传递给 QMainWindow.setCentralWidget @G.M.谢谢!在QWidget 中操作QLayout 更容易。但是我仍然无法将container 放在后面。 你说的“后面”是什么意思?你是说z顺序吗?请编辑您的问题并添加您尝试过的新代码。 是的,我的意思是 z 顺序。我刚刚将代码从 QMainWindow 移动到 QWidget 并添加了自定义 QLayout 【参考方案1】:

QWidget::createWindowContainer() 将处理窗口的几何形状,但是它确实改变了托管窗口仍然覆盖包含小部件的窗口的事实。因此,该小部件的任何子部件都将不可见,因为它会被 Qt3DWindow 遮挡。

唯一可行的选择是将您要覆盖的小部件移动到它们自己的窗口中并自己处理它的几何形状。

或者在 QDeclarativeWidget 中使用 Scene3D,但这会影响性能。

【讨论】:

【参考方案2】:

根据评论,QMainWindow 使用自己的布局类型,该类型负责其大部分(大部分)功能——停靠小部件、工具栏等。

您需要创建自己的小部件层次结构并将其传递给QMainWindow::setCentralWidget,而不仅仅是将小部件添加到那个布局。

如果您希望Buttons 位于container 前面,您可以使用QGridLayout

所以,您可以尝试类似(未经测试)...

class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)

        self.window = Window()  # Qt3DExtras.Qt3DWindow
        self.container = self.createWindowContainer(self.window)
        self.buttons = Buttons()
        central_widget = QWidget()
        central_widget_layout = QGridLayout()
        central_widget_layout.addWidget(self.container, 0, 0, 2, 1)
        central_widget_layout.addWidget(self.buttons.view, 0, 0, 1, 1)
        central_widget.setLayout(central_widget_layout)
        setCentralWidget(central_widget)

【讨论】:

谢谢!但这很遗憾是行不通的。 Qt3DWindow 依然在最前面。 真的吗?您确定以正确的顺序将小部件添加到布局 - self.containerthen self.buttons.view?您也可以尝试调用 self.buttons.view.raise() 来强制执行 z 顺序。 是的。我已经多次更改订单,并且还使用了self.buttons.view.raise_()self.container.lower()

以上是关于QLayout 中的重叠小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过拖放获取鼠标下QLayout中的小部件?

用户在不使用 QLayout 的情况下扩展/调整 QTextBrowser 小部件的大小

如何在 QLayout 中查找给定类型的小部件?

如何检测小部件是不是在堆栈中重叠?

如何检查两个小部件是不是在颤动中重叠?

QT自定义布局示例有关Overlappig小工具无法编译