PyQt5-list control, tree control, table control

Reprinted in "Quickly Master PyQt5" Chapter 19 List Control, Tree Control, Table Control

List control allows us to present content in the form of a list, making the interface more orderly and beautiful

QListWidget list control-used together with QListWidgetItem, the latter as an item is added to the list control, that is to say, each item in the list control is a QListWidgetItem.

QTreeWidget tree control-present content in a tree-like manner and use it with QTreeWidgetItem

QTableWidget table control———— present content in table form and use it with QTableWidgetItem

1. QListWidget list control

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_())

Output result:
Insert picture description here
2. QTreeWidget tree control

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_())

Output result:
Insert picture description here
3. QTableWidget table control

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_())

Output result:
Insert picture description here

Guess you like

Origin blog.csdn.net/peixin_huang/article/details/104328899