一、概念

关于逻辑行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!

最新文章

  1. LUA中将未分类数据分为测试集和训练集
  2. ajax的探究与使用
  3. SU Demo之01MakingData--02MultiShot
  4. 读javascript高级程序设计02-变量作用域
  5. iis+php+mysql
  6. hbase的rowkey简单设计
  7. WisDom.Net 框架设计(三) 数据缓存
  8. Quartz简单实例
  9. 解决IE6下select显示在弹出框上问题
  10. JS中的DOM— —节点以及操作
  11. Tomcat中的c3p0数据库连接池的释放
  12. Python动态绑定属性slots的使用
  13. Java使用RSA加密解密签名及校验
  14. 解决 Vim 的 quickfix 插件错误信息乱码问题
  15. Python3学习笔记08-tuple
  16. java 数组(二)
  17. Java axis2.jar包详解及缺少jar包错误分析
  18. Oracle空查询删除
  19. Silverlight中使用MVVM(3)—进阶
  20. SharePoint利用HttpModule的Init方法实现全局初始化

热门文章

  1. 分布式流平台Kafka
  2. tcp 客户端 发送syn
  3. Socket bind系统调用简要分析
  4. 第14章——高级IO函数
  5. 12.java设计模式之代理模式
  6. 面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!
  7. 在CorelDRAW2019创建对称绘图模式
  8. Vegas技巧分享,如何实现5.1立体声道
  9. yii2 删除数据
  10. Windows10通过NFS挂载linux目录