QLayout 中的重叠小部件
Posted
技术标签:
【中文标题】QLayout 中的重叠小部件【英文标题】:Overlapping widgets in QLayout 【发布时间】:2018-02-28 12:37:39 【问题描述】:我想创建一个窗口,后面是Qt3DWindow
,上面是一些QPushButton
s。然而,只显示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)
【问题讨论】:
QMainWindow
有自己专有的布局类型——您不能像使用任何其他布局一样简单地使用它。您需要将 Buttons
和 container
放在父 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.container
和 then self.buttons.view
?您也可以尝试调用 self.buttons.view.raise()
来强制执行 z 顺序。
是的。我已经多次更改订单,并且还使用了self.buttons.view.raise_()
和self.container.lower()
。以上是关于QLayout 中的重叠小部件的主要内容,如果未能解决你的问题,请参考以下文章