【发布时间】:2023-03-10 17:03:01
【问题描述】:
我想将各种小部件添加到表格小部件中的各种单元格,并且我想在这些小部件的值发生更改时触发命令。我可以根据需要将小部件放入表中,但在连接信号时遇到问题,因此我知道是哪个小部件生成了信号。
下面是一个解释问题的简单示例,仅使用复选框:
from PyQt5 import QtWidgets, QtGui, QtCore
class Main(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# create table:
self.table = QtWidgets.QTableWidget()
[self.table.insertRow(i) for i in [0,1,2]]
[self.table.insertColumn(i) for i in [0,1]]
# set values for first column:
self.table.setItem(0, 0, QtWidgets.QTableWidgetItem('A') )
self.table.setItem(1, 0, QtWidgets.QTableWidgetItem('B') )
self.table.setItem(2, 0, QtWidgets.QTableWidgetItem('C') )
# add checkboxes to second column:
cb0 = QtWidgets.QCheckBox( parent=self.table )
cb1 = QtWidgets.QCheckBox( parent=self.table )
cb2 = QtWidgets.QCheckBox( parent=self.table )
self.table.setCellWidget(0, 1, cb0)
self.table.setCellWidget(1, 1, cb1)
self.table.setCellWidget(2, 1, cb2)
# connect table signals:
self.table.cellChanged.connect(self.cell_changed)
self.table.itemChanged.connect(self.item_changed)
# connect checkbox signals:
cb0.clicked.connect(self.checkbox_clicked)
cb1.clicked.connect(self.checkbox_clicked)
cb2.clicked.connect(self.checkbox_clicked)
# show:
self.setCentralWidget(self.table)
self.setWindowTitle('TableWidget, CheckBoxes')
self.show()
def cell_changed(self, row, col):
print(row, col)
def checkbox_clicked(self, checked):
print(checked)
def item_changed(self, item):
print(item)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
main = Main()
app.exec_()
基于table.cellChanged.connect,当复选框更改时,我会天真地期待cellChanged 信号。然而,不会产生这个信号。 itemChanged 信号也不是。我确实可以看到clicked 信号,但这不是很有用,因为不清楚哪个复选框产生了信号。
解决问题的一种方法是为每个复选框创建一个不同的checkbox_clicked 函数,但这似乎并不优雅。
我的问题是:
为什么在更改复选框时既不生成
cellChanged也不生成itemChanged信号?应该如何连接信号才能知道哪个复选框生成了
clicked信号?
【问题讨论】:
标签: python python-3.x pyqt pyqt5 qtablewidget