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程序通 ...
随机推荐
- 等效介质理论模型---利用S参数反演法提取超材料结构的等效参数
等效介质理论模型---利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程.本文对等效介质理论模型进行了详细介绍,并提 ...
- python语言编程算法
编程题 1 台阶问题/斐波那契 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. fib = lambda n: n if n <= 2 else fi ...
- .NET EF实现NoLock
sql实现方法: select * from 表名(nolock) 加上(nolock) EF实现办法: 程序集引用 System.Transactions ...
- 万字长文,详解推荐系统领域经典模型FM因子分解机
在上一篇文章当中我们剖析了Facebook的著名论文GBDT+LR,虽然这篇paper在业内广受好评,但是毕竟GBDT已经是有些老旧的模型了.今天我们要介绍一个业内使用得更多的模型,它诞生于2010年 ...
- Pandas_VBA_数据分类比较
Python与VBA的比较2 需求: input文件中有两列数据,第一列为Name,第二列为Score,Name列里有重复的值,要求按照name的唯一值统计 score,输出到output文件按中. ...
- gcc 执行c++报错
D:\cpp>g++ hello.cc Info: resolving std::cout by linking to __imp___ZSt4cout (auto-import) c:/min ...
- python类继承中构造子的调用
python面向对象中的继承关系中,子类对父类的构造方法的调用有两种方法: 父类名.__init__(self,参数) #注意名字是父类 super(本子类名,self)__init__(其他参数) ...
- jQuery其他事件
ready(fn)当DOM载入就绪可以查询及操作时,绑定一个要执行的函数. resize([[data],fn])当调整浏览器窗口的大小时,发生resize事件.它属于BOM中的window对象. f ...
- linux tcp/ip 参数解析
后面整理相关信息/* * TCP option lengths */#define TCPOLEN_MSS 4 //只能出现在SYN段中#define TCPOLEN_W ...
- Netlink 内核实现分析 4
netlink 库函数: http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals #define NET ...