一、概念

关于逻辑行logicalRow、列logicalColumn和可见行visualRow、列visualColumn的概念,在QTableWidget中没有介绍,老猿查了比较多的资料,并经过验证,最终才搞清楚相关概念。这里有几个关键点要说明一下:

  1. 逻辑行和逻辑列是指项本身在部件中存储数据的行和列,是通过setItem将项与QTableWidget的逻辑行和列进行绑定的,也是通过QTableWidgetItem项方法row()和column()返回的值
  2. 界面可见行和列是指在部件上的行号和列号,从部件中第一行和第一列数据开始到指定逻辑行或逻辑列在部件内的序号,但隐藏行和列(这里的隐藏包括通过表头方法hideSection实现、数据在视口外、在可以手工调整行和列大小时将其大小调整到最小不可见)也必须参与在内。这个地方是个坑,说是可见行和可见列,但实际上隐藏未展现的和在视口外的数据都是参与行号和列号的计数
  3. 仅当部件中的行或列通过表头的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)

四、小结

  1. 表格部件QTableWidget的项设置方法(setItem)所使用的行和列是项的逻辑行号和列号,表示数据在表格部件的存储位置,表格部件中绝大多数方法所使用的行和列都是逻辑行和列。
  2. 仅当表格部件的表头使用moveSection方法才会导致表格部件的逻辑行列号可能和可见行列号不一致,行和列的隐藏以及超出视口都不会导致逻辑行列号可能和可见行列号不一致;
  3. 由于隐藏数据也在可见行列中计数,因此这儿的可见行列其实是不准确的,visualColumn和visualRow这两个方法在使用上需要注意。

老猿Python,跟老猿学Python!

PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究的更多相关文章

  1. PyQt学习随笔:QTableWidget的selectedRanges、setRangeSelected访问选中矩形范围的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget对项的操作支持选中多个项的情况下,可以通过方法selectedRanges ...

  2. PyQt学习随笔:Model/View中TableView视图数据项编辑结果及视图数据项的访问

    按照<PyQt学习随笔:Model/View中设置视图数据项可编辑的方法>的方法支持视图数据可编辑后,编辑后的数据无需主动保存,PyQt会自动将界面变更的数据保存到对应的Model存储中, ...

  3. PyQt学习随笔:Model/View架构中多个视图之间选择数据项同步

    我们知道多个视图之间通过使用相同的model就可以实现数据的共享(具体请参考< PyQt学习随笔:ListView控件的视图和数据模型分离案例>),除了数据的共享之外,多个视图之间还可以同 ...

  4. PyQt学习随笔:Model和View之间的数据互动过程

    在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...

  5. PyQt学习随笔:Qt Designer调用帮助时报错找不到assistant.exe文件的解决办法

    老猿是按照<第15.5节 PyQt5安装与配置>步骤安装的PyQt及相关工具,但最近在Qt Designer中点击帮助相关菜单时报错找不到assistant.exe文件,如图: 按照报错信 ...

  6. PyQt学习随笔:Model/View开发时在view数据项中设置不同角色数据的方法

    在往Model中通过QStandardItem等类插入数据项时,除了实际插入的存储数据,还可以设置不同角色(请参考<PyQt学习随笔:Model/View中诸如DisplayRole的数据角色及 ...

  7. PyQt学习随笔:Model/View开发时从Model相关类派生自定义类需要注意的问题

    在<PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项>介绍的方法,从Model相关类派生自定义类,通过重写setData方法以获取View中数据的 ...

  8. PyQt学习随笔:重写setData方法截获Model/View中视图数据项编辑的注意事项

    根据<PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法>可以重写从PyQt的Model类继承的setData方法来实时截获View中对数据的更改,但需要注意 ...

  9. PyQt学习随笔:通过自定义类重写QApplication的notify方法捕获应用的所有消息

    PyQt程序通过调用QApplication类的exec_()(sys.exit(app.exec_()) 进入程序主循环,开始处理事件,它从事件队列中获取本地窗口系统事件,将它们转化为 QEvent ...

  10. PyQt学习随笔:Qt事件类QEvent详解

    QEvent类是PyQt5.QtCore中定义的事件处理的基类,事件对象包含了事件对应的参数. <Python & PyQt学习随笔:PyQt主程序的基本框架>介绍了PyQt程序通 ...

随机推荐

  1. 剑指Offer-Python(21-25)

    21.栈的压入和弹出序列 新建一个栈,将数组A压入栈中,当栈顶元素等于数组B时,就将其出栈,当循环结束时,判断栈是否为空,若为空则返回true. class Solution: def IsPopOr ...

  2. Windows窗口置顶工具 简简单单 - 快快乐乐

    Windows窗口置顶工具 简简单单 - 快快乐乐 JERRY_Z. ~ 2020 / 11 / 12 转载请注明出处!️ 目录 Windows窗口置顶工具 简简单单 - 快快乐乐 一.官网下载Des ...

  3. Core WebApi项目快速入门(三):踩坑笔记

    目前做公司一个项目,遇到了一些坑.跟大家分享,避免再次采坑. 1. 服务端发布应用报错 在windows server上发布程序报错.系统缺少更新包. https://support.microsof ...

  4. JSON&AJAX

    JSON 定义:JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式.它基于 ECMAScript(欧洲计算机协会制定的 JS 规范)的一个子集 ...

  5. JS多物体宽度运动案例

    任务 对于每一个Div区块,鼠标移入,宽度逐渐变宽,最宽值为400px,当鼠标移除时,宽度逐渐减小,最小值为100px. 任务提示: (1)多物体运动的定时器需要需要每个物体上同时最多只能开一个定时器 ...

  6. 在 JavaScript 中,我们能为原始类型添加一个属性或方法吗?

    原始类型的方法 JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等).JavaScript 还提供了这样的调用方法.我们很快就会学习它们,但是首先我们将了解它的工作原理,毕竟原始 ...

  7. 如何替换Ceph的Journal

    很多人会提出这样的问题: 能不能够将 Ceph journal 分区从一个磁盘替换到另一个磁盘? 怎样替换 Ceph 的 journal 分区? 有两种方法来修改Ceph的journal: 创建一个j ...

  8. [LeetCode题解]86. 分隔链表 | 三指针 + 虚拟头节点

    解题思路 三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历 代码 /** * Definition for singly-linked list. * public ...

  9. MyBatis 使用手册

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作.MyBatis 可以通过简单的 XM ...

  10. HDU100题简要题解(2080~2089)

    //2089之前忘做了,周二C语言课上做,至于2086,写题解的时候突然发现之前的做法是错的,新的解法交上去CE,等周二再弄吧,其余题目暂时可以放心 HDU2080 夹角有多大II 题目链接 Prob ...