将子布局设计为主GridLayout

时间:2014-09-04 11:57:15

标签: python pyqt4

我已经做了这个标签:我是PyQt和QtLibs的新手。

这是用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 :(得分: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_())

答案 1 :(得分: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()

的原因相同