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

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值