将子布局设计为主GridLayout
我做了这个标签页,我是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()
是同样的原因。