PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究
一、概念
关于逻辑行logicalRow、列logicalColumn和可见行visualRow、列visualColumn的概念,在QTableWidget中没有介绍,老猿查了比较多的资料,并经过验证,最终才搞清楚相关概念。这里有几个关键点要说明一下:
- 逻辑行和逻辑列是指项本身在部件中存储数据的行和列,是通过setItem将项与QTableWidget的逻辑行和列进行绑定的,也是通过QTableWidgetItem项方法row()和column()返回的值
- 界面可见行和列是指在部件上的行号和列号,从部件中第一行和第一列数据开始到指定逻辑行或逻辑列在部件内的序号,但隐藏行和列(这里的隐藏包括通过表头方法hideSection实现、数据在视口外、在可以手工调整行和列大小时将其大小调整到最小不可见)也必须参与在内。这个地方是个坑,说是可见行和可见列,但实际上隐藏未展现的和在视口外的数据都是参与行号和列号的计数
- 仅当部件中的行或列通过表头的moveSection交换了行或列数据所在的位置时才出现逻辑行列和可见行列不一致的情况
二、逻辑行相关方法
QTableWidget中可以根据项实例去获取项的逻辑行和列位置,调用方法如下:
- int column( QTableWidgetItem item)
- int row( QTableWidgetItem item)
如果对应项在QTableWidget表格部件中不存在,则返回-1。
三、可见行和列相关方法
3.1、相关方法
要获取表格部件中的可见行号和列号,调用方法:
- int visualColumn(int logicalColumn)
- int visualRow(int logicalRow)
3.2、案例
3.2.1、 案例说明
本案例在QTableWidget部件中显示4行3列数据,根据数据的逻辑行号和列号显示表头,如第一行显示"行1",第一列显示"列1",对应项存储的数据为“(行号-1,列号-1)”,“行号-1”、“列号-1”就是项的逻辑行号和列号,因为计数是从0开始。
为了显示逻辑数据和可见数据的差别,案例中将第一行数据(行号为0)进行隐藏,同时将第4行数据移动到了第3行。
为了观察数据,实现了项被点击时输出相关逻辑行、列和可见行和列以及项存储的数据。
3.2.2、 项初始化initItems()方法代码
    def initItems(self):
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(3  )
        width = self.tableWidget.viewport().width() - 20
        for row in range(4):
            for col in range(3):
                item = QtWidgets.QTableWidgetItem(f"({row},{col})" )
                self.tableWidget.setItem(row,col,item)
        self.tableWidget.setVerticalHeaderLabels(['行1','行2','行3','行4'])
        self.tableWidget.setHorizontalHeaderLabels(['列1','列2','列3'])
        self.tableWidget.verticalHeader().moveSection(3,2) #将第4行移动到第3行
        self.tableWidget.verticalHeader().hideSection(0) #隐藏第一行
3.2.3、 项点击槽方法代码
    def cellClicked( self,rowid,  column):
        r = self.tableWidget.visualRow(rowid)
        c = self.tableWidget.visualColumn(column)
        item = self.tableWidget.currentItem()
        print(f"点击了部件项,对应项的逻辑行和列为:({rowid},{column}),可见行和列为:({r},{c}),存储数据为:{item.text()}")
3.2.4. 运行截图

从上述截图可以看到,逻辑的第一行数据不可见,第三行和第四行数据交换了位置。
3.2.5、点击项(1,0)输出信息
在界面上点击可见的第一行和第一列数据(对应数据为“(1,0)”)输出信息
点击了部件项,对应项的逻辑行和列为:(1,0),可见行和列为:(1,0),存储数据为:(1,0)
由于隐藏的行也参与可见行号的计算,因此该项的逻辑行和可见行相同。
3.2.6、点击项(3,1)输出信息
在界面上点击可见的第二行和第二列数据(对应数据为“(3,1)”)输出信息:
点击了部件项,对应项的逻辑行和列为:(3,1),可见行和列为:(2,1),存储数据为:(3,1)
由于第二行数据实际对应的逻辑行是3(从0计数),可见行(含隐藏行)是2(也是从0计数),所以逻辑行和可见行数据不同
3.2.7. 点击项(2,2)输出信息
在界面上点击可见的第三行和第三列数据(对应数据为“(2,2)”)输出信息:
点击了部件项,对应项的逻辑行和列为:(2,2),可见行和列为:(3,2),存储数据为:(2,2)
四、小结
- 表格部件QTableWidget的项设置方法(setItem)所使用的行和列是项的逻辑行号和列号,表示数据在表格部件的存储位置,表格部件中绝大多数方法所使用的行和列都是逻辑行和列。
- 仅当表格部件的表头使用moveSection方法才会导致表格部件的逻辑行列号可能和可见行列号不一致,行和列的隐藏以及超出视口都不会导致逻辑行列号可能和可见行列号不一致;
- 由于隐藏数据也在可见行列中计数,因此这儿的可见行列其实是不准确的,visualColumn和visualRow这两个方法在使用上需要注意。

老猿Python,跟老猿学Python!
PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究的更多相关文章
- PyQt学习随笔:QTableWidget的selectedRanges、setRangeSelected访问选中矩形范围的方法
		老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget对项的操作支持选中多个项的情况下,可以通过方法selectedRanges ... 
- PyQt学习随笔:Model/View中TableView视图数据项编辑结果及视图数据项的访问
		按照<PyQt学习随笔:Model/View中设置视图数据项可编辑的方法>的方法支持视图数据可编辑后,编辑后的数据无需主动保存,PyQt会自动将界面变更的数据保存到对应的Model存储中, ... 
- PyQt学习随笔:Model/View架构中多个视图之间选择数据项同步
		我们知道多个视图之间通过使用相同的model就可以实现数据的共享(具体请参考< PyQt学习随笔:ListView控件的视图和数据模型分离案例>),除了数据的共享之外,多个视图之间还可以同 ... 
- PyQt学习随笔:Model和View之间的数据互动过程
		在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ... 
- PyQt学习随笔:Qt Designer调用帮助时报错找不到assistant.exe文件的解决办法
		老猿是按照<第15.5节 PyQt5安装与配置>步骤安装的PyQt及相关工具,但最近在Qt Designer中点击帮助相关菜单时报错找不到assistant.exe文件,如图: 按照报错信 ... 
- PyQt学习随笔:Model/View开发时在view数据项中设置不同角色数据的方法
		在往Model中通过QStandardItem等类插入数据项时,除了实际插入的存储数据,还可以设置不同角色(请参考<PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及 ... 
- PyQt学习随笔:Model/View开发时从Model相关类派生自定义类需要注意的问题
		在<PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的 ... 
- PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项
		根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意 ... 
- PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息
		PyQt程序通过调用QApplication类的exec_()(sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvent ... 
- PyQt学习随笔:Qt事件类QEvent详解
		QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ... 
随机推荐
- 监控-Cat项目部署
			一.Cat的项目背景 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大 ... 
- 9.集合set和frozenset冻结集合函数
			集合set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以在set中没有重复的key. 集合中的元素要求是不可变的并且还是唯一的,我们就利用它是唯一来做去重. ... 
- ubuntu 文件编码格式 转换
			正在学习jquery,之前在windows下弄的编码到了 ubuntu下,乱码: 找到一个方法: iconv : 源文件:a.htm 格式:gbk: 目标: a.html 格式:utf8: ic ... 
- JSON小结【json-lib】
			javabean:Address package com.baebae.model; public class Address { private String city; private Strin ... 
- 头秃了,二十三张图带你从源码了解Spring Boot 的启动流程~
			持续原创输出,点击上方蓝字关注我 目录 前言 源码版本 从哪入手? 源码如何切分? 如何创建SpringApplication? 设置应用类型 设置初始化器(Initializer) 设置监听器(Li ... 
- 小程序·云开发地表最强CI利器来了
			小程序CI 与 CloudBase-FrameWork 从2017年开始,微信小程序的能力也随着前端的大发展的趋势越来越多,包体积限制越来越宽松,大型微信小程序的开发团队越来越多,为了适应形式,微信小 ... 
- vdbench测试实时可视化显示
			前言 前一段时间碰到一个系统,用rados bench 去跑都还比较正常,但是一跑数据库就非常慢,测试工具会抛出延时过大的提示,经过排查发现,云平台中有一台虚拟机还运行着备份数据库的服务,而这个备份软 ... 
- Linux vi种 wq 、wq!、x、q、q!区别
			上面的命令只是在vi编辑命令中使用 wq:表示保存退出 wq!:表示强制保存退出 x:表示保存退出 wq和wq!的区别如下: 有些文件设置了只读,一般不是修改文件的,但是如果你是文件的owner或者r ... 
- Python_科学计算库
			说明:若没有训练级联表,则需要相关级联表才能实现功能 文字识别 # -*- coding: utf-8 -*- """ 简介:用样本训练数据,再识别 "&quo ... 
- web安全原理-文件包含漏洞
			前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ... 
