一、当使用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__":
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__":
app=QApplication(sys.argv)
table=QMyTableWidget()
table.show()
sys.exit(app.exec_())
三.总结
主要是利用了QObject的sender()函数获得发送信号的对象,然后通过其位置获取表中的行与列