PyQt(Python+Qt)学习随笔:QStandardItemModel指定行和列创建模型中的项以及索引
一、引言
QStandardItemModel有两种构造方法:
- QStandardItemModel(QObject parent = None):直接创建一个模型实例,数据未进行初始化,可以通过setItem将QStandardItem的实例对象添加到模型中作为项。
- QStandardItemModel(int rows, int columns, QObject parent = None):直接创建一个模型实例,包含有rows行columns列的空项。这些项可以通过model的index方法获取后,通过QModelIndex的setData方法进行数据修改。当模型中存储实际数据少于指定的行或列时,多出部分显示空数据。
第一种方法因为项是逐项添加,并且在添加过程中构造了QStandardItem项,这个好理解。第二种方法直接指定行数和列数,是否就自动生成项了呢?我们来做个验证。
二、验证QStandardItemModel(int rows, int columns, QObject parent = None)是否存在项
2.1、验证步骤
2.1.1、创建指定行数和列数的QStandardItemModel模型并与视图关联
在视图的构造方法中添加创建模型的代码,示例语句:
self.model = QStandardItemModel(10, 3)
self.tableView.setModel(self.model)
此时运行代码,界面初始如下:

2.1.2、在界面视图创建一个鼠标双击的信号和槽的连接
在Designer中进入信号编辑界面创建信号和槽连接,如图:

2.1.3、在界面派生类中实现槽方法
为了观察相关项的情况,在槽方法中输出相关观察数据,示例代码:
def doubleClickView(self,index):
row,col = index.row(),index.column()
print(f"doubleClickView index info:\nindex={index},row,col={row},{col}")
self.showItemInf(row,col)
上述代码中index为鼠标双击信号传递过来的QModelIndex的项索引,指向Model中具体点击对应的项,该索引中包含项所在的行和列以及父节点等信息。方法showItemInf展示项相关的信息。具体实现代码如下:
def showItemInf(self,row,col):
item = self.model.item(row, col) #调用model的item方法获取项
if item:
itemData = item.data() #获取项对应的文本
itemIndex = item.index() #获取项对应的索引
else:
itemData = None
itemIndex = None
print(f"item={item},itemData={itemData},itemIndex={itemIndex}")
index = self.model.index(row,col) #调用model的index方法获取行和列对应项的索引
if index:indexData = index.data() #获取索引对应项的文本
else:indexData = None
print(f"index={index},indexData={indexData}")
2.1.4、运行代码,输出相关信息
运行后,鼠标双击视图中的项,如双击第1行第1列的项,上述代码输出如下信息:
doubleClickView index info:
index=<PyQt5.QtCore.QModelIndex object at 0x0000000003DB57B8>,row,col=0,0
item=None,itemData=None,itemIndex=None
index=<PyQt5.QtCore.QModelIndex object at 0x0000000003E5D128>,indexData=None
从上述输出信息可以得出如下结论:
- 鼠标双击传递的QModelIndex参数与通过行和列获取的QModelIndex实例不是同一个对象,但他们指向的数据相同
- 通过模型的item方法按指定行和列获取数据项,返回结果为None,即模型使用带行和列的参数创建后,实际上没有对应的项
- 虽然没有项,但模型索引并不为None,老猿认为这表明模型索引只是一个指向model中对应数据位置的索引,并不指向真正存储的数据,但应该在模型索引中包含指向对应项数据的信息,用于获取对应数据

老猿Python,跟老猿学Python!
PyQt(Python+Qt)学习随笔:QStandardItemModel指定行和列创建模型中的项以及索引的更多相关文章
- PyQt(Python+Qt)学习随笔:QStandardItemModel指定行和列创建模型后的数据项初始化的两种方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QStandardItemModel通过构造方法 QStandardItemModel(int ro ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...
- PyQt(Python+Qt)学习随笔:部件的大小策略sizePolicy的含义
在Qt Designer中的每个部件,除了设置部件的位置(geometry)之外,还可以指定部件的大小策略sizePolicy.部件的sizePolicy用于说明部件在布局管理中的缩放方式,当部件没有 ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButtons标准按钮
在Qt Designer中,可以在界面中使用QDialogButtonBox来配置一组按钮进行操作,Qt中为QDialogButtonBox定义了一组常用的标准按钮,可以在Designer中直接在St ...
- PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeHint属性
在两种Spacer部件中都有sizeHint属性,在<PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸.minimumSizeHint建议最 ...
- PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性
老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...
- PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑>中,老猿觉得dragE ...
随机推荐
- c++的基本点
C++的要点: 一个思想:抽象(和分类)的思想: 三个概念:类.对象.消息: 三个特征:封装.继承.多态: 一个观念:函数服务于数据. 程序 = 对象 + 消息 ...
- Redis下载
Windows版下载地址 https://github.com/tporadowski/redis/releases Linux版下载地址 https://redis.io/download
- 二、多线程及服务器编程总结------linux多线程服务端编程
- 借助boost bind/function来实现基于对象编程。
boost bind/function库的使用: 替换了stl中mem_fun,bind1st,bin2nd等函数.用户注册回调函数需要利用boost/bind转化成库中boost/function格 ...
- Java 类型信息详解和反射机制
本文部分摘自 On Java 8 RTTI RTTI(RunTime Type Information)运行时类型信息,能够在程序运行时发现和使用类型信息,把我们从只能在编译期知晓类型信息并操作的局限 ...
- TTL门和MOS门悬空输入的处理
引言 本来是数字电路学习时很重要的考点,但是总容易忘掉,所以记录一下~ 内容 TTL TTL电路中的TTL是Transistor-Transistor-Logic的英文缩写,指的是晶体管逻辑电路,即T ...
- java多线程---张孝祥
1.java web 中,一次http请求是一个任务,因为服务器里面有线程池的,存在一个线程处理多个请求任务. 2.在java中,vector,hashtable,concurrentHashMap是 ...
- mysql之索引组织表
1.二叉树/平衡树.B-tree.B+tree.B*tree 树:最上一层是根节点.最底下一层是叶子节点.(一般左边节点小于右边节点) 二叉树:每个节点最多只能有两个分支,一般只用于教材.二叉树的深度 ...
- 关于点击弹框外部区域弹框关闭的交互处理(前端JS)
常见需求场景 前端在处理交互的时候,经常遇到这样的场景,点击一个按钮,出现一个弹框,点击外部区域,弹框关闭. 解决方法 思路说明: 1.给弹框的div父级都加个类名,如: 2.在document绑定一 ...
- HTTP 报文格式简介
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送 WWW 方式的数据,关于 HTTP 协议的详细内容请参考 RFC2616.HTTP 协议采用了请求/响 ...