转载于《快速掌握PyQt5》第十九章 列表控件、树形控件、表格控件
列表控件可以让我们以列表形式呈现内容,是界面更加有序美观
QListWidget列表控件————与QListWidgetItem一起使用,后者作为项被添加入列表控件中,也就是说列表控件中的每一项都是一个QListWidgetItem。
QTreeWidget树形控件————以树状方式呈现内容,并与QTreeWidgetItem搭配使用
QTableWidget表格控件————以表格形式呈现内容,并与QTableWidgetItem一起使用
1、QListWidget列表控件
import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QListWidget, QListWidgetItem, QHBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.listwidget_1 = QListWidget(self)
self.listwidget_2 = QListWidget(self)
self.listwidget_1.doubleClicked.connect(lambda: self.change_func(self.listwidget_1))
self.listwidget_2.doubleClicked.connect(lambda: self.change_func(self.listwidget_2))
# 为listwidget_1添加QListWidgetItem
for i in range(6):
text = 'Item {}'.format(i)
self.item = QListWidgetItem(text)
self.listwidget_1.addItem(self.item)
self.item_6 = QListWidgetItem('Item 6', self.listwidget_1)
self.listwidget_1.addItem('Item 7')
str_list = ['Item 9', 'Item 10']
self.listwidget_1.addItems(str_list)
self.item_8 = QListWidgetItem('Item 8')
self.listwidget_1.insertItem(8, self.item_8)
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.listwidget_1)
self.h_layout.addWidget(self.listwidget_2)
self.setLayout(self.h_layout)
#槽函数,点击listwidget_1中的某一item,为listwidget_2添加item,点击listwidget_2中的某一item,去除该item
def change_func(self, listwidget):
if listwidget == self.listwidget_1:
item = QListWidgetItem(self.listwidget_1.currentItem())
self.listwidget_2.addItem(item)
print(self.listwidget_2.count())
else:
self.listwidget_2.takeItem(self.listwidget_2.currentRow())
print(self.listwidget_2.count())
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
输出结果:
2、QTreeWidget树形控件
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QLabel, QHBoxLayout
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(500, 300)
self.label = QLabel('No Click') # QLabel控件用于显示每个QTreeWidgetItem的文本;
self.tree = QTreeWidget(self) # 设置行数与列数
self.tree.setColumnCount(2)
self.tree.setHeaderLabels(['Install Components', 'Test'])
self.tree.itemClicked.connect(self.change_func)
# 实例化一个QTreeWidgetItem,并将其父类设为self.tree,表示self.preview为最外层(最顶层)的项,接着通过setText(int, str)方法来设置文本
self.preview = QTreeWidgetItem(self.tree)
self.preview.setText(0, 'Preview')
# setCheckState(int, CheckState)方法可以让该项以复选框形式呈现出来,addChild(QTreeWidgetItem)方法可以添加子项,这里让self.preview添加一个self.qt5112选项;
self.qt5112 = QTreeWidgetItem()
self.qt5112.setText(0, 'Qt 5.11.2 snapshot')
self.qt5112.setCheckState(0, Qt.Unchecked)
self.preview.addChild(self.qt5112)
choice_list = ['macOS', 'Android x86', 'Android ARMv7', 'Sources', 'iOS']
self.item_list = []
for i, c in enumerate(choice_list): # 实例化5个子项,将他们添加到self.qt5112中,并以复选框形式显示;
item = QTreeWidgetItem(self.qt5112)
item.setText(0, c)
item.setCheckState(0, Qt.Unchecked)
self.item_list.append(item)
self.test_item = QTreeWidgetItem(self.qt5112)
self.test_item.setText(0, 'test1')
self.test_item.setText(1, 'test2')
self.tree.expandAll() # 调用expandAll()方法可以让QTreeWidget所有的项都是以打开状态显示的。
self.h_layout = QHBoxLayout()
self.h_layout.addWidget(self.tree)
self.h_layout.addWidget(self.label)
self.setLayout(self.h_layout)
def change_func(self, item, column):
self.label.setText(item.text(column))
print(item.text(column))
print(column)
if item == self.qt5112:
if self.qt5112.checkState(0) == Qt.Checked:
[x.setCheckState(0, Qt.Checked) for x in self.item_list]
else:
[x.setCheckState(0, Qt.Unchecked) for x in self.item_list]
else: # 10
check_count = 0
for x in self.item_list:
if x.checkState(0) == Qt.Checked:
check_count += 1
if check_count == 5:
self.qt5112.setCheckState(0, Qt.Checked)
elif 0 < check_count < 5:
self.qt5112.setCheckState(0, Qt.PartiallyChecked)
else:
self.qt5112.setCheckState(0, Qt.Unchecked)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
输出结果:
3、QTableWidget表格控件
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
class Demo(QTableWidget):
def __init__(self):
super(Demo, self).__init__()
self.setRowCount(6) # 设置行数与列数
self.setColumnCount(6)
print(self.rowCount()) # 打印行数与列数
print(self.columnCount())
self.setColumnWidth(0, 30) # 设置行宽与类高
self.setRowHeight(0, 30)
self.setHorizontalHeaderLabels(['h1', 'h2', 'h3', 'h4', ' h5', 'h6']) # 设置每一列的名称
self.setVerticalHeaderLabels(['t1', 't2', 't3', 't4', 't5', 't6']) # 设置每一行的名称
# self.setShowGrid(False) # 设置是否显示表格上的网格线,True为显示,False不显示
self.item_1 = QTableWidgetItem('Hi') # 填表,第一行第一列填Hi
self.setItem(0, 0, self.item_1)
self.item_2 = QTableWidgetItem('Bye') # 填表,第三行第三列填Hi
self.item_2.setTextAlignment(Qt.AlignCenter)
self.setItem(2, 2, self.item_2)
self.setSpan(2, 2, 2, 2) # 合并行列
print(self.findItems('Hi', Qt.MatchExactly)) # findItems(str, Qt.MatchFlag)方法用来进行查找,前一个参数为用来匹配的字符串,后一个参数为匹配方式。在代码中我们用了两种匹配方式,第一种为Qt.MatchExactly,表示精确匹配。第二种为Qt.MatchContains,表示包含匹配。
print(self.findItems('B', Qt.MatchContains))
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
输出结果: