pyqt 对QTableWidget里的QWidget对象进行信号绑定

一、当使用QTableWidget的setCellWidget向表控件添加自选控件后,插入的自选控件进行操作时,不能通过QTableWidget的变化信号获取具体的行和列(cellActivated、cellChanged等信号都无效)

  以下代码是实现表中的下拉框1和下拉框2变化时,列3的文本变为前两者的值.可以测试cellChanged信号无效(其他的可同样测试)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class QMyTableWidget(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setRowCount(1)
        self.setColumnCount(3)
        comboA=QComboBox()
        comboA.addItems(['1','2','3'])
        comboB=QComboBox()
        comboB.addItems(['4','5','6'])
        labelC=QLabel()
        Sum=int(comboA.currentText())+int(comboB.currentText())
        labelC.setText(str(Sum))
        self.setCellWidget(0,0,comboA)
        self.setCellWidget(0,1,comboB)
        self.setCellWidget(0,2,labelC)
        self.cellChanged.connect(self.__onCellChangedTable)
        
    #表单元变化的槽函数
    def __onCellChangedTable(self,row,col):
        if col==0 or col==1:
            comboA=self.cellWidget(row,0)
            comboB=self.cellWidget(row,1)
            labelC=self.cellWidget(row,2)
            Sum=int(comboA.currentText())+int(comboB.currentText())
            labelC.setText(str(Sum))
    
if __name__=="__main__":
    #qt程序
    app=QApplication(sys.argv)   
    table=QMyTableWidget()
    table.show()
    sys.exit(app.exec_())
   

二.使用信号绑定解决

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class QMyTableWidget(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setRowCount(1)
        self.setColumnCount(3)
        comboA=QComboBox()
        comboA.addItems(['1','2','3'])
        comboA.currentTextChanged.connect(self.__onCellWidgetChanged)
        comboB=QComboBox()
        comboB.addItems(['4','5','6'])
        comboB.currentTextChanged.connect(self.__onCellWidgetChanged)
        labelC=QLabel()
        Sum=int(comboA.currentText())+int(comboB.currentText())
        labelC.setText(str(Sum))
        self.setCellWidget(0,0,comboA)
        self.setCellWidget(0,1,comboB)
        self.setCellWidget(0,2,labelC)
        
    #表单元变化的槽函数
    def __onCellWidgetChanged(self,text):
        s=self.sender()#获取发信号的对象
        index=self.indexAt(s.pos())#获取对象在表中的位置
        row=index.row()
        col=index.column()
        if col==0 or col==1:
            comboA=self.cellWidget(row,0)
            comboB=self.cellWidget(row,1)
            labelC=self.cellWidget(row,2)
            Sum=int(comboA.currentText())+int(comboB.currentText())
            labelC.setText(str(Sum))
    
if __name__=="__main__":
    #qt程序
    app=QApplication(sys.argv)   
    table=QMyTableWidget()
    table.show()
    sys.exit(app.exec_())

三.总结

  主要是利用了QObject的sender()函数获得发送信号的对象,然后通过其位置获取表中的行与列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值