PyQt5——列表视图、树形视图、表格视图

本文转载自《快速掌握PyQt5》第二十章 列表视图、树形视图、表格视图

控件与视图的区别:
列表控件QListWidget,树形控件QTreeWidget和表格控件QTableWidget是基于项(item-based)的控件,它们分别与QListWidgetItem,QTreeWidgetItem以及QTableWidgetItem一起使用。在基于项的控件中,数据是存储于项中再由对应的控件添加进去并显示的
列表视图QListView,树形视图QTreeView和表格视图QTableView是基于模型的(model-based),也就是说有关数据的获取或者存储操作都是跟模型有关。当我们在处理大量数据的时候,采用基于模型的控件可以让程序的处理速度更快,性能更好。
QListView,QTreeView和QTableView分别是QListWidget,QTreeWidget和QTableWidget的父类,后三者的目的主要是为了使用方便,让开发更加快速(准确来说后三者也可以是视图,不过笔者还是习惯将前三者称作视图,后三者称为控件,比较好区分)。在高端复杂的程序中,还是建议使用前三者。

PyQt5中所提供的模型种类及用处:
QStringListModel 存储一个字符串列表
QStandardItemModel 存储任意的分层次的数据
QDirModel 封装本地文件系统
QSqlQueryModel 封装一个SQL结果集
QSqlTableModel 封装一个SQL表
QSqlRelationalTableModel 利用外键封装一个SQL表
QSortFilterProxyModel 对模型数据进行排序或过滤

列表视图QListView

import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QStringListModel
from PyQt5.QtWidgets import QApplication, QWidget, QListView, QLabel, QHBoxLayout, QAbstractItemView
 
 
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()

        # 首先用列表推导式生成11个item,然后实例化一个QStringListModel并用setStringList(iterable)方法将数据添加到到模型中;
        self.item_list = ['item %s' % i for i in range(11)]         
        self.model_1 = QStringListModel(self)
        self.model_1.setStringList(self.item_list)
 
        # model_1用于listview_1,model_2用于listview_2;
        self.model_2 = QStringListModel(self)                       
 
        self.listview_1 = QListView(self)                          
        self.listview_1.setModel(self.model_1)
        self.listview_1.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listview_1.doubleClicked.connect(lambda: self.change_func(self.listview_1))
 
        self.listview_2 = QListView(self)                         
        self.listview_2.setModel(self.model_2)
        self.listview_2.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.listview_2.doubleClicked.connect(lambda: self.change_func(self.listview_2))
 
        self.pic_label = QLabel(self)                             
        self.pic_label.setPixmap(QPixmap('arrow.png'))
 
        self.h_layout = QHBoxLayout()
        self.h_layout.addWidget(self.listview_1)
        self.h_layout.addWidget(self.pic_label)
        self.h_layout.addWidget(self.listview_2)
        self.setLayout(self.h_layout)
 
    def change_func(self, listview):                                
        if listview == self.listview_1:                             
            self.model_2.insertRows(self.model_2.rowCount(), 1)
 
            data = self.listview_1.currentIndex().data()
            index = self.model_2.index(self.model_2.rowCount()-1)
            self.model_2.setData(index, data)
        else:                                                     
            self.model_2.removeRows(self.listview_2.currentIndex().row(), 1)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

树形视图QTreeView

import sys
from PyQt5.QtCore import QDir
from PyQt5.QtWidgets import QApplication, QWidget, QTreeView, QDirModel, QLabel, QVBoxLayout
 
 
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(600, 300)
        self.model = QDirModel(self)                          
        self.model.setReadOnly(False)
        self.model.setSorting(QDir.Name | QDir.IgnoreCase)
 
        self.tree = QTreeView(self)                             
        self.tree.setModel(self.model)
        self.tree.clicked.connect(self.show_info)
        self.index = self.model.index(QDir.currentPath())       
        self.tree.expand(self.index)
        self.tree.scrollTo(self.index)
 
        self.info_label = QLabel(self)                       
 
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.tree)
        self.v_layout.addWidget(self.info_label)
        self.setLayout(self.v_layout)
 
    def show_info(self):                                        # 4
        index = self.tree.currentIndex()
        file_name = self.model.fileName(index)
        file_path = self.model.filePath(index)
        file_info = 'File Name: {}\nFile Path: {}'.format(file_name, file_path)
        self.info_label.setText(file_info)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

表格视图QTableView

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QApplication, QWidget, QTableView, QAbstractItemView, QLabel, QVBoxLayout
 
 
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(650, 300)
 
        self.model = QStandardItemModel(6, 6, self)            
        # self.model = QStandardItemModel(self)
        # self.model.setColumnCount(6)
        # self.model.setRowCount(6)
 
        for row in range(6):                                   
            for column in range(6):
                item = QStandardItem('({}, {})'.format(row, column))
                self.model.setItem(row, column, item)
 
        self.item_list = [QStandardItem('(6, {})'.format(column)) for column in range(6)]
        self.model.appendRow(self.item_list)                   
 
        self.item_list = [QStandardItem('(7, {})'.format(column)) for column in range(6)]
        self.model.insertRow(7, self.item_list)                
 
        self.table = QTableView(self)                          
        self.table.setModel(self.model)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.table.clicked.connect(self.show_info)
 
        self.info_label = QLabel(self)                         
        self.info_label.setAlignment(Qt.AlignCenter)
 
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.table)
        self.v_layout.addWidget(self.info_label)
        self.setLayout(self.v_layout)
 
    def show_info(self):                                       
        row = self.table.currentIndex().row()
        column = self.table.currentIndex().column()
        print('({}, {})'.format(row, column))
 
        data = self.table.currentIndex().data()
        self.info_label.setText(data)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

猜你喜欢

转载自blog.csdn.net/peixin_huang/article/details/104332986
今日推荐