如何在 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 中设置小部件的顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?

如何在tkinter中设置小部件的大小?

Kivy:在 python 代码中设置小部件禁用属性

使用属性窗口在 QT 网格布局中设置小部件的行和列

Wordpress:如何在菜单中放置小部件区域

如何在 QTreeWidget 中设置小列宽?