Qt中QTabWidget添加控件(按钮,label等)以及使用方法
今天遇到了一个问题,已经在QTabWidget
每一行添加了一个按钮,我有一个需求就是,点击每一行的按钮都有各自的响应
首先说一下添加控件代码:
添加文字可以用setItem
,添加控件就得用setCellWidget
了。
self.checkButton = QtWidgets.QPushButton('查看')
self.abnor_act_rec_table.setCellWidget(i, 4, self.checkButton)
我的QTabWidget
的表名是abnor_act_rec_table
,i
表示表格的第i
行。
现在我想要每一行的checkButton
都得有自己对应的响应,我肯定先要获得每一行的按钮,通过搜索后可以使用cellWidget
方法获得,响应又需要槽函数,所以代码如下:
self.abnor_act_rec_table.cellWidget(i, 4).clicked.connect(self.checkPic)
槽函数是checkPic
。
然后问题就来了,槽函数怎么知道是我点击的哪个按钮呢,我尝试给checkPic
加一个参数,然后emit
一个数字,发现发送的全是True
和False
,这是因为clicked
只有True
和False
两个值。
然后,然后,我乱七八糟的搜索了解到了sender()
, 这玩意就用于判断是什么信号给槽发送了信号,于是我在槽函数checkPic
中打印了以下self.sender()
,发现点击不同按钮打印的是按钮对象以及在内存中的地址,类似<PyQt5.QtWidgets.QPushButton object at 0x000001DDE6F54160>
这种东西,确实是分辨出来了,但是我没法用啊,我想知道是哪一行的按钮。
然后我又偶然想到了前几天看代码的一个东西叫做setObjectName()
,那么sender()
既然是一个对象,那它肯定有个名字,搜了以下可以用objectName()
函数获得,因此就解决了,可以用setObjectName()
给每个按钮自定义一个名字啊,我给它的名字就是行号,代码如下:
self.checkButton.setObjectName('btn{}'.format(id))
然后在槽函数checkPic
中可以直接利用self.sender().objectName()
知道是哪一行的按钮发来的信号了。
sender
还有很多作用,比如还可以判断是什么对象发来的信号。