PyQT 更改内部 QVBoxLayout 在 GridLayout 中的位置

Vel*_*dan 1 position python-3.x pyqt5

我正在使用 PyQT,并且我有非常简单的结构网格布局和内部 BoxLayout 到该网格中(下面由 QtDesigner 生成的代码。抱歉,它的视图很难看)

简而言之,这是我的 BoxLayer

self.gridLayout.addLayout(self.buttonsLayer, 2, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

后来我尝试通过执行此指令来更改它的位置(我想将此布局移动到 GridLayout 的第 3 行)

self.gridLayout.addLayout(self.buttonsLayer, 3, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

但我有一个错误QLayout::addChildLayout: 布局“buttonsLayer”已经有一个父级

一开始,我在网格布局中有按钮,但后来我决定将它们推入某个容器中,并仅移动该容器,而不是移动 2 个对象。但是..奇怪的是,对于单个按钮这个技巧是有效的,但对于布局它不起作用。

也许有人知道为什么它不起作用以及如何更改 BoxLayer 的位置?感谢您提供任何信息!

 MainWindow.setObjectName("MainWindow")
    MainWindow.resize(608, 173)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
    self.verticalLayout.setObjectName("verticalLayout")
    self.gridLayout = QtWidgets.QGridLayout()
    self.gridLayout.setObjectName("gridLayout")
    self.addFileBtn_0 = QtWidgets.QPushButton(self.centralwidget)
    self.addFileBtn_0.setObjectName("addFileBtn_0")
    self.gridLayout.addWidget(self.addFileBtn_0, 0, 0, 1, 1)
    self.lineEditFile_0 = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEditFile_0.setText("")
    self.lineEditFile_0.setObjectName("lineEditFile_0")
    self.gridLayout.addWidget(self.lineEditFile_0, 0, 1, 1, 1)
    self.addFileBtn_1 = QtWidgets.QPushButton(self.centralwidget)
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(self.addFileBtn_1.sizePolicy().hasHeightForWidth())
    self.addFileBtn_1.setSizePolicy(sizePolicy)
    self.addFileBtn_1.setObjectName("addFileBtn_1")
    self.gridLayout.addWidget(self.addFileBtn_1, 1, 0, 1, 1)
    self.lineEditFile_1 = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEditFile_1.setObjectName("lineEditFile_1")
    self.gridLayout.addWidget(self.lineEditFile_1, 1, 1, 1, 1)
    self.buttonsLayer = QtWidgets.QVBoxLayout()
    self.buttonsLayer.setObjectName("buttonsLayer")
    self.addFileGroupBtn = QtWidgets.QPushButton(self.centralwidget)
    self.addFileGroupBtn.setObjectName("addFileGroupBtn")
    self.buttonsLayer.addWidget(self.addFileGroupBtn)
    self.saveConfigBtn = QtWidgets.QPushButton(self.centralwidget)
    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
    sizePolicy.setHorizontalStretch(0)
    sizePolicy.setVerticalStretch(0)
    sizePolicy.setHeightForWidth(self.saveConfigBtn.sizePolicy().hasHeightForWidth())
    self.saveConfigBtn.setSizePolicy(sizePolicy)
    self.saveConfigBtn.setObjectName("saveConfigBtn")
    self.buttonsLayer.addWidget(self.saveConfigBtn)
    self.gridLayout.addLayout(self.buttonsLayer, 2, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

Vel*_*dan 5

经过 10-20 次不同的尝试来实现我想要的目标和本机 QT 文档调查后,我终于找到了一个可能的解决方案。我不确定这是否是一种理想的方式,但它确实有效。如果您有更好的解决方案 - 请告诉我!我会被占用。

这是解决方案

#  remove this item(it's  aLayout so we can't use removeWidget) from GridLayout
self.gridLayout.removeItem(self.buttonsLayer)

# now we can insert it into some new place. Voalia =)
self.gridLayout.addLayout(self.buttonsLayer, self.fieldGroupCounter + 1, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

希望它能帮助别人!亲切的问候。