一、引言

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指定行和列创建模型中的项以及索引的更多相关文章

  1. PyQt(Python+Qt)学习随笔:QStandardItemModel指定行和列创建模型后的数据项初始化的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QStandardItemModel通过构造方法 QStandardItemModel(int ro ...

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

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

  3. PyQt(Python+Qt)学习随笔:部件的大小策略sizePolicy的含义

    在Qt Designer中的每个部件,除了设置部件的位置(geometry)之外,还可以指定部件的大小策略sizePolicy.部件的sizePolicy用于说明部件在布局管理中的缩放方式,当部件没有 ...

  4. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButtons标准按钮

    在Qt Designer中,可以在界面中使用QDialogButtonBox来配置一组按钮进行操作,Qt中为QDialogButtonBox定义了一组常用的标准按钮,可以在Designer中直接在St ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的sizeHint属性

    在两种Spacer部件中都有sizeHint属性,在<PyQt(Python+Qt)学习随笔:Qt Designer中部件的三个属性sizeHint缺省尺寸.minimumSizeHint建议最 ...

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

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

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

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

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

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

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

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

随机推荐

  1. NodeJs 加入Windows开机自启动服务

    首先需要到http://nssm.cc/download/?page=download 下载 nssm,下下来之后是压缩包形式的解压之后,在命令行模式下进入到nssm的目录.之后运行:nssm ins ...

  2. python爬虫05正则表达式

    字符 描述 \ 将下一个字符标记为一个特殊字符(File Format Escape,清单见本表).或一个原义字符(Identity Escape,有^$()*+?.[\{|共计12个).或一个向后引 ...

  3. B/S图书管理系统

    B/S图书管理系统 系统管理 ①新用户注册 ②用户信息修改:修改信息,修改密码 ③锁定用户 ④注销用户 书籍管理 ①新书入库 ②借书办理 ③还书办理 ④书记注销 个人管理 ①图书查询 ②借书单查询 ③ ...

  4. 面试题:能谈谈Date、Datetime、Time、Timestamp、year的区别吗?

    一. 推荐阅读 首发地址:https://mp.weixin.qq.com/s/9zKX86P4kzlKla6-NyS3EA 使用推荐阅读,有更好的阅读体验 二.准备 如果面试官问你:了解 date. ...

  5. cmd 命令行

    理想的情况下,所有的程序都能自描述, 比如 mysql -h,支持哪些命令,每项命令需要哪些参数 命令行工具有几个有关进程的命令, tasklist taskkill http://hi.baidu. ...

  6. Vue 计算属性与方法

    computed 基本使用 如果数据需要有复杂的计算,则可以在Vue实例中定义计算属性,再交由mustache进行渲染. computed内部其实是通过getttr实现的,所以不用加括号即可完成其下方 ...

  7. web开发的本质

    1.浏览器上输入一个网址回车后都发生了什么? (1)浏览器相当于一个客户端,将域名翻译成ip,浏览器给服务端发送一个消息. (2)服务端拿到消息 (3)服务端返回消息 (4)浏览器展示页面 2.客户端 ...

  8. java~通过springloaded实现热部署

    之前写过使用自定义的classLoader进行动态加载,热部署:它有很多弊端,我总结一下: 当前项目不能引用第三方包 当前项目必须使用反射的方式调用第三方包的方法 写死的一些路径 springload ...

  9. 用MindManager做完思维导图后怎么加密

    使用MindManager我们可以制作出很多简洁明了的思维导图,然而,不论是分享还是查看这些导图,我们往往需要对导图进行加密操作,尤其是制定公司或企业的下一步发展计划时,加密导图就显得很有必要了. M ...

  10. guitar pro 系列教程(十):关于Guitar Pro声部的使用技巧

    作为一个刚接触吉他的萌音乐的玩家,我们在创作吉他谱时一定要注意其中的声部搭配,因为各个声部的配器音色和旋律会对我们的曲子有着非常重要的影响,而声部的把控技术,也可以体现一个音乐人的能力水平的一方面.今 ...