QLayout 中的重叠小部件

Overlapping widgets in QLayout

我想创建一个 window,其中 Qt3DWindow 在后面,QPushButton 在它上面。但是只显示了 Qt3DWindow 个动画,没有看到 QPushButton 个动画。我还希望有 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 使用自己的布局类型,该类型负责其大部分(大部分)功能——停靠小部件、工具栏等。

您需要创建自己的小部件层次结构并将其传递给 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)

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

唯一可行的替代方法是将您想要叠加的小部件移动到它们自己的 window 中并自己处理它的几何形状。

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