• PyQt5-QListView控件


    MVC编程思想

    • 源数据由模型 (Model) 读取,然后在视图 (View) 组件上显示和编辑,在界面上编辑修改的数据又通过模型保存到源数据。
    • Model/View 结构将数据模型和用户界面分离开来,分别用不同的实现,是一种显示和编辑数据的有效结构,在处理大型数据时尤其明显。
    • 二者之间数据的交互则是通过委托(delegate)来实现。

    常用Models

    QT提供了一些现成的models用于处理数据项。

    • QStringListModel 用于存储简单的QString列表。
    • StandardItemModel 管理复杂的树型结构数据项,每项都可以包含任意数据。
    • QDirModel 提供本地文件系统中的文件与目录信息。
    • QSqlQueryModel, QSqlTableModel,QSqlRelationTableModel用来访问数据库。

    QListView常用方法:

    名称描述
    setModel()用来设置View所关联的Model,可以使用Python原生的list作为数据源Model
    setCurrentIndex()设置当前选中的项目
    setViewMode()设置视图模式。(ListMode: 条目从上到下布局,小尺寸显示, IconMode: 条目从左到右布局,大尺寸显示)
    listView.model().rowCount()ListView中的Item总数

    QListView常用信号

    clicked: 单击某项时,发射此信号;
    doubleClicked: 双击击某项时,发射此信号;
    activated: 当用户激活index指定的项目时,发射此信号;
    entered: 当鼠标光标进入index指定的项目时,发射此信号;
    iconSizeChanged: 在视图可见时设置此图标大小时,发射此信号;
    indexesMoved: 在视图中移动索引时,发射此信号;
    pressed: 按下鼠标按钮时,发射此信号;
    viewportEntered: 当鼠标光标进入视图时,发射此信号。


    步骤

    • QListView对象
    • 定义model,使用model的setStringList方法或者appendRow(item)给model填数。
    • QListView.setModel()方法关联二者。
    • 槽函数传递的参数是选中的index。
    import os
    import sys
    
    from PyQt5.QtGui import QIcon, QStandardItem, QStandardItemModel
    from PyQt5.QtWidgets import (QApplication, QWidget, QListView,
                                 QLabel, QVBoxLayout)
    
    
    class DemoListView(QWidget):
        def __init__(self, parent=None):
            super(DemoListView, self).__init__(parent)
            self.setWindowTitle("QListView 例子")
            self.resize(480, 360)
            self.init_ui()
    
        def init_ui(self):
            v_box = QVBoxLayout(self)
            l_view = QListView(self)
            s_model = QStandardItemModel()
            self.sports = [
                {'img': '/images/dog.png', 'title': '篮球'},
                {'img': '/images/boy.jpg', 'title': '足球'}]
    
            for sport in self.sports:
                item = QStandardItem(QIcon(os.path.dirname(__file__) + sport['img']), sport['title'])
                s_model.appendRow(item)
    
            l_view.setModel(s_model)
            l_view.clicked.connect(self.on_listview_clicked)
            self.label = QLabel(self)
    
            v_box.addWidget(l_view)
            v_box.addWidget(self.label)
            self.setLayout(v_box)
    
            l_view.setCurrentIndex(s_model.index(1, 0))  # 设置选中第一行
            self.label.setText('当前选择为: ' + self.sports[0]['title'])
    
        def on_listview_clicked(self, index):
            self.label.setText('当前选择为: ' + self.sports[index.row()]['title'])
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = DemoListView()
        window.show()
        sys.exit(app.exec_())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    from PyQt5.Qt import *
    import sys
    
    
    class ListViewDemo(QWidget):
        def __init__(self, parent=None):
            super(ListViewDemo, self).__init__(parent)
            self.setWindowTitle("QListView 例子")
            self.resize(300, 50)
            vbox = QVBoxLayout()
    
            l_view = QListView()                # 创建一个listview对象
            string_model = QStringListModel()   # 创建model
            self.qList = ['Item 1', 'Item 2', 'Item 3', 'Item 4']  # 添加的数组数据
            string_model.setStringList(self.qList)  # 将数据设置到model
            l_view.setModel(string_model)       #绑定 l_view 和 model
            l_view.clicked.connect(self.clickedlist)
            vbox.addWidget(l_view)
            self.setLayout(vbox)
            l_view.setCurrentIndex(string_model.index(2))  # 设置选中第一行
            print(l_view.model().rowCount())
            print(l_view.selectedIndexes())
    
        def clickedlist(self, index):
            QMessageBox.information(self, "QListView", "你选择了: " + self.qList[index.row()])
            print("点击的是:" + str(index.row()))
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = ListViewDemo()
        win.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    .Net Framework、.Net Core和.Net Standard的区别
    Vagrant+VirtualBox+Docker+MySQL+Redis+Nacos
    基于 Next.js实现在线Excel
    TypeError: __init__() got an unexpected keyword argument ‘transport_options‘
    DBeaver manual
    浅谈滤波中Q和R的调整——KF第三篇笔记
    C# HttpClient使用和注意事项,.NET Framework连接池并发限制
    LFS(Linux From Scratch)构建过程全记录(七):进入Chroot并构建临时工具
    ThinkPHP5小语种学习平台
    (算法设计与分析)第三章动态规划-第一节2:动态规划之使用“斐波那契数列”问题说明重叠子问题如何解决
  • 原文地址:https://blog.csdn.net/weixin_48668114/article/details/127435223