将子布局设计为主GridLayout

0 投票
2 回答
1885 浏览
提问于 2025-04-19 19:25

我做了这个标签页,我是PyQt和Qt库的新手。

这个是用PyQt4做的:

class AddressBookTab(QtGui.QWidget):
def __init__(self):
    super(AddressBookTab, self).__init__()
    self.initUI()

def initUI(self):
    grid = QtGui.QGridLayout()
    grid.setSpacing(10)

    self.section1 = QtGui.QGridLayout()
    self.section2 = QtGui.QGridLayout()

    grid.addChildLayout(self.section1)
    grid.addChildLayout(self.section2)

    self.addrbook = QtGui.QTableWidget()
    self.addrbook.setColumnCount(4)
    self.addrbook.setHorizontalHeaderLabels(['','Name', 'Address', ''])
    self.addrbook.setColumnWidth(1, 200)
    self.addrbook.setColumnWidth(2, 300)

    header = self.addrbook.horizontalHeader()
    header.setStretchLastSection(True)

    Name = QtGui.QLabel('Name')
    Address = QtGui.QLabel('Address')
    NameEdit = QtGui.QLineEdit()
    AddressEdit = QtGui.QTextEdit()

    self.section1.addWidget(self.addrbook, 0, 0)

    self.section2.addWidget(Name, 0, 0)
    self.section2.addWidget(NameEdit, 0, 1)
    self.section2.addWidget(Address, 1, 0)
    self.section2.addWidget(AddressEdit, 1, 1)

    self.setLayout(grid)
    self.setGeometry(300, 300, 350, 300)
    self.show()

我需要建立两个独立的子布局,

第一个在顶部,应该加载一个通讯录表格,这个已经可以正常工作了。

第二个标签页在底部,是一些与表格相关的工具:编辑通讯录,使用几个按钮进行一些操作等等。

可能我还没有搞懂子布局是怎么工作的,因为界面上没有显示它们。

任何帮助我解决这个问题,让子布局显示出来,或者有什么更好的方法的建议,我都非常感激。

2 个回答

0

你为什么要使用这个方法 QLayout.addChildLayout (self, QLayout l) 呢?其实,只有在你自己做一个支持嵌套布局的自定义布局时,才需要直接调用它。

所以,你使用 QtGui.QGridLayout 的时候,其实并不需要调用这个方法。你应该使用 QGridLayout.addLayout (self, QLayout, int row, int column, Qt.Alignment alignment = 0) 来实现你的需求。

举个例子:

import sys
from PyQt4 import QtGui

class AddressBookTab (QtGui.QWidget):
    def __init__ (self):
        super(AddressBookTab, self).__init__()
        mainQGridLayout = QtGui.QGridLayout()
        mainQGridLayout.setSpacing(10)

        self.section1QGridLayout = QtGui.QGridLayout()
        self.section2QGridLayout = QtGui.QGridLayout()

        mainQGridLayout.addLayout(self.section1QGridLayout, 0, 0)
        mainQGridLayout.addLayout(self.section2QGridLayout, 1, 0)

        self.addrBookQTableWidget = QtGui.QTableWidget()
        self.addrBookQTableWidget.setColumnCount(4)
        self.addrBookQTableWidget.setHorizontalHeaderLabels(['','nameQLabel', 'addressQLabel', ''])
        self.addrBookQTableWidget.setColumnWidth(1, 200)
        self.addrBookQTableWidget.setColumnWidth(2, 300)

        headerQHeaderView = self.addrBookQTableWidget.horizontalHeader()
        headerQHeaderView.setStretchLastSection(True)

        nameQLabel           = QtGui.QLabel('nameQLabel')
        addressQLabel        = QtGui.QLabel('addressQLabel')
        nameEditQLineEdit    = QtGui.QLineEdit()
        addressEditQTextEdit = QtGui.QTextEdit()

        self.section1QGridLayout.addWidget(self.addrBookQTableWidget, 0, 0)

        self.section2QGridLayout.addWidget(nameQLabel,           0, 0)
        self.section2QGridLayout.addWidget(nameEditQLineEdit,    0, 1)
        self.section2QGridLayout.addWidget(addressQLabel,        1, 0)
        self.section2QGridLayout.addWidget(addressEditQTextEdit, 1, 1)

        self.setLayout(mainQGridLayout)
        self.setGeometry(300, 300, 350, 300)
        self.show()

myQApplication = QtGui.QApplication([])
myAddressBookTab = AddressBookTab()
myAddressBookTab.show()
sys.exit(myQApplication.exec_())
0

要回答你的问题,合并两个布局可以这样做:

grid1 = QGridLayout()
grid2 = QGridLayout()
combined_grid = QGridLayout()
combined_grid.addLayout(grid1, 0, 0)
combined_grid.addLayout(grid, 1, 0)

这个方法适用于所有布局。在你的情况下,我建议使用 QVboxLayout(),也就是说,简单地使用:

vbox = QVBoxLayout()
vbox.addLayout(grid1)
vbox.addLayout(grid2)

其实,你并不需要你的布局 self.section1,因为它只包含一个小部件。为了简化,可以使用:

vbox.addWidget(self.addressbook)
vbox.addLayout(self.section2)

至于为什么不推荐使用 addChildLayout(),文档里有说明——“这个函数是从 addLayout() 或 insertLayout() 函数在子类中调用的,用来将布局 l 添加为子布局。你只有在实现支持嵌套布局的自定义布局时,才需要直接调用它。”这和为什么使用 addWidget() 而不是 addChildWidget() 是同样的原因。

撰写回答