QLayout中重叠的小部件

时间:2018-02-28 12:37:39

标签: python user-interface qt5 qt3d pyside2

我想创建一个窗口,其后面是Qt3DWindow,上面有一些QPushButton。但是,仅显示Qt3DWindow动画并且未看到QPushButton s。我也想要Qt3DWindow功能和QPushButton s(所以我可以点击后面的按钮或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)

2 个答案:

答案 0 :(得分:1)

根据评论,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)

答案 1 :(得分:1)

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

唯一可行的选择是将您想要叠加的小部件移动到他们自己的窗口中并自己处理它的几何体。

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