QLayout 中的重叠小部件
Overlapping widgets in QLayout
我想创建一个 window,其中 Qt3DWindow
在后面,QPushButton
在它上面。但是只显示了 Qt3DWindow
个动画,没有看到 QPushButton
个动画。我还希望有 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)
根据评论,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,但这会影响性能。
我想创建一个 window,其中 Qt3DWindow
在后面,QPushButton
在它上面。但是只显示了 Qt3DWindow
个动画,没有看到 QPushButton
个动画。我还希望有 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)
根据评论,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,但这会影响性能。