如何在 QGridLayout 中设置小部件的顺序
Posted
技术标签:
【中文标题】如何在 QGridLayout 中设置小部件的顺序【英文标题】:How to set the order of widgets in QGridLayout 【发布时间】:2019-08-13 06:05:14 【问题描述】:我正在尝试将QPushButton
放在PlotWidget
之上。我当前的代码总是在按钮顶部有绘图小部件。如何将按钮带到QGridLayout
的前面?
或者PyQt5
中是否有更好的方法来覆盖小部件?
我尝试使用 .raise__()
和 .lower__()
都没有按预期工作。
据我发现PyQt5
中无法设置 z 值
更改将小部件添加到 QGridLayout
的顺序没有效果
PlotWindow
类用于 Window 控制器类以及其他一些类的 Stacked 小部件中
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.central_widget = QtWidgets.QStackedWidget()
self.setCentralWidget(self.central_widget)
self.plot = PlotWindow(self)
self.central_widget.addWidget(self.plot)
self.central_widget.setCurrentWidget(self.plot)
self.show()
class PlotWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super(PlotWindow, self).__init__(parent)
plot_frame = pyqtgraph.PlotWidget()
self.connect_btn = QtWidgets.QPushButton("Connect", self)
plot_wrapper_layout = QtWidgets.QGridLayout()
plot_wrapper_layout.addWidget(plot_frame, 0, 0, 12, 12)
plot_wrapper_layout.addWidget(self.connect_btn, 11, 11, 1, 1)
self.setLayout(plot_wrapper_layout)
期望:按钮在右下角的图表顶部可见
结果:连接按钮隐藏在绘图小部件后面
【问题讨论】:
试试plot_frame = pyqtgraph.PlotWidget(self)
。这会将图形小部件放在 PlotWindow.children()
中的按钮之前,这会改变它们的呈现顺序。
@Heike 这很有趣。我想这是由于 PlotWidgets 的复杂性质(它可能仅在初始化期间重新设置其子级)。但是,有趣的是,如果您不为 PlotWidget 和 QPushButton 设置父级,您也会得到预期的结果。
@Heike 修复了它,谢谢,忽略了。
@musicamante 是的,从 QPushButton 中删除 self 也有效,但我猜这样做不是一个好习惯?
@Dustin2902 这不是总是必要的,因为addWidget
使用 addItem
: "所有权 of QLayoutItem [请注意,not 小部件!] 被转移到布局中,而删除它是布局的责任”。这意味着,至少对于标准 Qt 小部件,它们的父级所有权(以及它们的直接子级的父级)应该转移到布局的小部件。但。这并不意味着小部件的父级自动成为布局正在使用的小部件,特别是如果 changeEvent
没有像基本 QWidgets 那样重载。
【参考方案1】:
plot_frame = pyqtgraph.PlotWidget(self)。这会将图形小部件放在 PlotWindow.children() 中的按钮之前,这会改变它们的呈现顺序。
Heikie 的评论解决了这个问题
【讨论】:
以上是关于如何在 QGridLayout 中设置小部件的顺序的主要内容,如果未能解决你的问题,请参考以下文章