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程序通 ...
随机推荐
- php之简单工厂模式
<?php /** * Created by PhpStorm. * User: 小狗蛋儿 * Date: 2017/11/13 * Time: 22:21 */ abstract class ...
- 4、Python语法之变量
一 引入 我们学习Python语言是为了控制计算机.让计算机能够像人一样去工作,所以在Python这门语言中,所有语法存在的意义都是为了让计算机具备人的某一项技能,这句话是我们理解后续所有Python ...
- 2.while循环
while循环 #-*- coding: utf-8-*- #指定识别utf-8的字符串 1.while循环以及跳出循环 while True: #无限循环 print('i love pyhon') ...
- SpringBoot整合JWT实战详解
jwt 介绍就不多说了,下面通过代码演示开发过程中jwt 的使用. (1)在pom.xml中引入对应的jar <dependency> <groupId>io.jsonwebt ...
- mysql查询上月天数/当月第一天/上月第一天
select (DATEDIFF(DATE_ADD(curdate(), INTERVAL - DAY(curdate())+ 1 DAY), date_add(curdate()- DAY(curd ...
- prometheus监控golang服务实践
一.prometheus基本原理介绍 prometheus是基于metric采样的监控,可以自定义监控指标,如:服务每秒请求数.请求失败数.请求执行时间等,每经过一个时间间隔,数据都会从运行的服务中流 ...
- tcp 保活定时器分析 & Fin_WAIT_2 定时器
tcp keepalive定时器 http server 和client端需要防止"僵死"链接过多!也就是建立了tcp链接,但是没有报文交互, 或者client 由于主机突然掉电! ...
- linux Netfilterr中扩展match target
Match: netfilter定义了一个通用的match数据结构struct xt_match /* 每个struct xt_match代表一个扩展match,netfilter中各个扩展match ...
- 线程与更新UI,消除偏见,细谈原理
前言 相信不少读者都阅读过相类似的文章了,但是我还是想完整的把这之间的关系梳理清楚,细节聊好,希望你也能从中学到一些. 进入正题,大家应该都听过这样一句话--"UI更新要在主线程,子线程更新 ...
- git-新建git用户流程-1
1.输入:https://git-scm.com/ 2.点击try git 4.注册git填写用户名和密码,邮箱,验证邮箱 5.选择免费的版本 6.创建仓库名称 创建成功见截图