被恶心了半天QTableWidget的一个坑

一个把我恶心半天的PyQt5的QTableWidget的一个坑。

PS:如果在重写事件方法实现逻辑无法获取正确的行,可直接拉到最后看顿悟!(尴尬碎了一地…)

事件场景:
今天在做QTableWidget点击按钮交换行的问题:
在这里插入图片描述
点击了箭头按钮,将12行数据移动到11行上面。
我使用的逻辑是,获取对应行的位置text(),重新实例化新的QTableWidgetItem到目标行中,由于cellWidget只是按钮,无需改变,遂不动。也就是因为这样,带来了个坑。
坑:
只要点击改变行后,无论代码再怎么setCurrentItem(),setCurrentIndex()后使用currentRow()都获取不到正确的行数。

爬坑:
经过各种尝试,这样的场景下代码必须使用setCellWidget()来设置当前行。

猜测:
应该是QTableWidget内部自己有个设置当前行的机制:
1 在整个表中无cellWidget或有cellWidget的实例从未被点击选中时,setCurrentItem(),setCurrentIndex(),setCellWidget()等方法都是等效的。
2 一旦表中的cellWidget被点击后,setCurrentItem(),setCurrentIndex()的优先级便不够了。
3 在三者中。setCellWidget(row, col)优先级最高并且可屏蔽另外两个,但当参数中的row和col对应的位置只是QTableWidgetItem时也不能覆盖先前的点击cellWidget问题

结果:
要想使用currentRow()方法获取正确的行。使用setCellWidget(row, col)方法比较保险,且row,col对应的位置有一个cellWidget实例。

2020-12-02顿悟:
出现以上的情况是我在处理右击事件的函数中,先使用currentRow()获取了当前行,执行完右击逻辑后才用super()调用父类mousePressEvent()方法,故无法正确获取行.
若在重写的mousePressEvent()方法中首先super()调用父类方法再执行右键逻辑,则不会出现以上情况!

最后,重写事件方法,请先使用super()调用父类方法后再执行自己的逻辑.避免如我一样入坑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值