• PyQt(Python+Qt)学习随笔:model/view架构中类QStandardItemModel的使用方法


    一、概述

    QStandardItemModel是QAbstractItemModel的派生类,用于在Model/View架构中存储自定义数据的通用模型,可以用于在任何支持QAbstractItemModel接口的view(例如QListView、QTableView和QTreeView,以及自定义视图)中作为数据存储。

    QStandardItemModel可以用作标准Qt数据类型的数据存储Model。QStandardItemModel提供了一种经典的基于项的方法来处理模型中的数据。QStandardItemModel模型中的项对应类型必须为QStandardItem。

    二、定义方法

    定义QStandardItemModel对象的方法:

    • QStandardItemModel(parent: QObject = None)
    • QStandardItemModel(int rows, int columns, parent: QObject = None)

    方法一定义一个QStandardItemModel对象,未指定行数和列数,实际上构造的是一个空的QStandardItemModel对象,后续可以使用appendRow()、insertRow()在添加数据项。
    方法二定义了一个指定行数和列数的QStandardItemModel对象,但具体数据项同样未初始化,可以通过setItem方法进行初始化。

    三、数据添加

    在view对应的数据存储初始化时,通常创建一个空的QStandardItemModel对象,并使用appendRow()、insertRow()添加一行数据项。

    对应语法如下:

    • appendRow(Iterable[QStandardItem])
    • void appendRow(QStandardItem item)
    • void insertRow(int row, Iterable[QStandardItem] ))
    • void insertRow(int row, QStandardItem item)
    • bool insertRow(int row, parent:QModelIndex =QModelIndex())
    注意:
    • 使用appendRow、insertRow时,数据项必须是QStandardItem类型,QStandardItem创建时存储的真正数据必须是文本字符串型,其他类型必须先进行类型转换
    • insertRow插入行时可以先不添加数据项(使用insertRow(int row, QModelIndex parent=QModelIndex())),后续通过setItem再设置对应数据项
    • Qt的QList类型在PyQt中不支持,凡是QList类型的变量可以使用Python的任何可迭代类型替代,上述语法中的Iterable[QStandardItem] 表示一个存储元素类型为QStandardItem的可迭代类型如列表,这样一次可以添加一行多个字段的数据
    • 同一个QStandardItem数据项不能在一个视图中添加两次,否则后面一次的调用实际上是没有添加数据项
    • insertRow的参数行号必须是当前已经存在的数据行号(从0开始计数),否则将返回None或False

    四、数据项查询

    4.1、item()

    使用item()方法访问QStandardItemModel对象中的项,语法如下:

    • QStandardItem item(int row, int column = 0)

    通过item方法还可以返回指定行和列对应的数据项。

    4.2、text()

    知道一个QStandardItemModel对象中的数据项以后,可以通过该数据项的text()方法获取对应数据的值。语法如下:

    • str QStandardItem.text()

    五、数据修改

    5.1、setItem()设置数据项

    可以使用setItem()将数据指定到对应的行和列的位置,语法如下:

    • setItem(int row, int column, QStandardItem item)

    该方法将QStandardItemModel对象中对应行和列位置的数据项设置为新的参数item对应项,如果原来未指定项,则相当于数据项初始化,否则就是替换原有数据项。

    5.2、查询数据项+setText()修改数据项的值

    如果一个QStandardItemModel对象中对应行和列位置的数据项已经设置,但需要修改该数据项数据的值,可以使用setText()来修改该数据项的值。语法如下:

    • setText(str text)

    其中参数text就是要修改数据的对应字符串值。

    六、删除数据

    要删除QStandardItemModel对象中对应的数据,可以使用removeRow,语法如下:

    • removeRow(int row,QModelIndex parent=QModelIndex())

    参数row指明要删除的数据行,parent表示要删数据的父节点,对于树形视图来说需要使用,对于链表视图和表格视图用缺省值即可。

    七、其他方法

    • 可以使用setRowCount()和setColumnCount()更改该对象的行数和列数
    • 可以使用insertColumn()按列插入数据项,使用removeColumn()按列删除数据项
    • 可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()设置QStandardItemModel对象的标题标签
    • 可以使用findItems()在QStandardItemModel对象中搜索符合要求的数据项,并通过调用sort()对QStandardItemModel对象中的数据项进行排序
    • 可以调用clear()方法删除QStandardItemModel对象的所有数据项
    • 可以使用index()方法获取对应数据项的索引数据,可参考《PyQt学习随笔:Qt中Model/View中的Model Index

    七、案例

    本案例实现了一个initViewData方法,将一个窗口的listView对象(对象名为Designer缺省名listView,没有修改)和tableView对象(对象名为Designer缺省名tableView,没有修改)使用同一个存储Model,model对象名为 self.itemModel ,设置为3列,3列数据组成为:数字序号+‘:‘+20个数字和空格字符串,行数为18行。

         l = [(digit, ":  ", (str(digit) + ' ') * 20) for digit in range(1, 10)]
            self.itemModel = QtGui.QStandardItemModel()
            self.itemModel.setColumnCount(3)
            for line in l:
                record = []
    
                for col in line:
                    item = QtGui.QStandardItem(str(col))
                    record.append(item)
    
                ret = self.itemModel.insertRow(0,record)
                ret = self.itemModel.appendRow( record)
    
            self.listView.setModel(self.itemModel)
            self.tableView.setModel(self.itemModel)
    

    运行截图如下:
    在这里插入图片描述
    在这里插入图片描述
    可以看到只有前9行生成了数据,后9行无数据,因为代码中appendRow的数据是前面insertRow已经处理了数据项列表,不能重复插入,但对应插入导致Model的行数被扩充。

    老猿Python,跟老猿学Python!

  • 相关阅读:
    [CSP-S模拟测试]:迷宫(最短路)
    [CSP-S模拟测试]:五子棋(模拟)
    [CSP-S模拟测试]:点亮(状压DP+树上背包DP)
    [CSP-S模拟测试]:统计(树状数组+乱搞)
    [CSP-S模拟测试]:组合(欧拉路)
    [CSP-S模拟测试]:笨小猴(随机化)
    最小表示法
    BZOJ4868 [Shoi2017]期末考试 【三分 + 贪心】
    BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】
    BZOJ4919 [Lydsy1706月赛]大根堆 【dp + 启发式合并】
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12235069.html
Copyright © 2020-2023  润新知