一、概述

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!

PyQt(Python+Qt)学习随笔:model/view架构中类QStandardItemModel的使用方法的更多相关文章

  1. PyQt(Python+Qt)学习随笔:设定toolButton弹出菜单的方法

    在Qt Designer中toolButton可以通过popupMode设定菜单弹出的模式,但并不能在Qt Designer中指定toolButton的弹出菜单,toolButton只能通过代码来指定 ...

  2. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  3. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...

  4. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑

    老猿Python博文目录 老猿Python博客地址 dragEnabled属性用于控制视图是否支持拖拽,可以通过dragEnabled().setDragEnabled(bool enable)进行属 ...

  5. PyQt(Python+Qt)学习随笔:QAbstractItemView的selectionMode属性

    老猿Python博文目录 老猿Python博客地址 一.概述 selectionMode属性用于控制view中操作选择数据项的模式,用于控制用户是否可以选择一个或多个数据项,以及在多个数据项选择中,选 ...

  6. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

  7. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

  8. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑>中,老猿觉得dragE ...

  9. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

随机推荐

  1. F1分数

    分类的常用指标有: accuracy:准确率 recall:召回率 precison:精确率 f1score:f1分数,是recall和precison的调和均值. 准确率什么情况下失效? 在正负样本 ...

  2. 自定义MFC对话窗口的类名

    默认情况下,MFC对话框的窗口类名为"#32770",如果想自定义窗口类名呢,需要两步: 1.修改rc文件 这一步需要直接编辑rc文件,使用任意记事本工具即可,找到窗口的相关定义, ...

  3. 使用bootstrap fileinput多文件拖拽上传的记录

    今天琢磨文件上传,刚好看到bootstrap 我就搜了一下,刚刚能满足需求,使用上手也很快,使用完还是记录下来. 1.首先我们下载插件包,可以用nuget搜索bootstrap-fileinput 也 ...

  4. 03 . Vue基础之计算属性,组件基础定义和使用

    vue组件 fetch请求组件 fetch XMLHttpRequest是一个设计粗糙的API, 配置和调用方式非常混乱,而且基于事件的异步模型写起来不友好,兼容性不好. <!DOCTYPE h ...

  5. linux命令使用 cut/sort/uniq

    我记得之前去XX网面试的那个面试题是这样的:有个apache.log 文件文本内容如下:======================[niewj@centSvr ~]$ cat apache.log  ...

  6. 经典分治问题,平面N个点求最近点对

    大家好,我们今天来看一道非常非常经典的算法题--最近点对问题. 这个问题经常在各种面试当中出现,难度不低,很少有人能答上来.说实话,我也被问过,因为毫无准备,所以也没有答上来.是的,这道题有点神奇,没 ...

  7. 使用qmake编译时拷贝文件

    使用qmake构建项目时,需要在make时拷贝一些文件到指定位置,非执行make install,下面总结列举一下我了解的方式 COPIES 示例pro 1 COPY_DIR = $$PWD/copy ...

  8. 自行实现的jar包中,日志库的适配实现

    ​ 日常情况下,我们自己都会自行实现一些基础的jar包,如dao包.service包或一些其他完成特定功能的jar包.如果没有一套调试日志信息,出现问题时想查找问题非常不方便.可能大多数小伙伴都会有自 ...

  9. mysql之多表查询的其他查询

    1,临时表查询 (1)需求:查询高于本部门平均工资的人员 select * from person as p, (select dept_id, avg(salary) as '平均工资' from ...

  10. 新建Chrome标签页,极简+自用

    [跳转GitHub] chromeNewTab 已经入坑Chrome应用开发者,可以去:[应用商店地址]直接添加使用. 使用说明 下载chrome的一个[window组策略文件],解压文件后找到(\p ...