我有以下代码填充QTableWidget:
def populate_phone_table(self):
dataRows=["Office","Fax","Mobile","Other"]
self.tbl_phone_numbers.setRowCount(4)
self.tbl_phone_numbers.setColumnCount(2)
for ndx,value in enumerate(dataRows):
item = QTableWidgetItem(value)
item.setFlags(Qt.ItemIsEditable)
item.setForeground(QColor(0,0,0))
self.tbl_phone_numbers.setItem(ndx,0,item)
item = QTableWidgetItem("")
self.tbl_phone_numbers.setItem(ndx, 1, item)
self.tbl_phone_numbers.verticalHeader().hide()
self.tbl_phone_numbers.resizeRowsToContents()
self.tbl_phone_numbers.horizontalHeader().setSectionResizeMode(1,QHeaderView.Stretch)
self.tbl_phone_numbers.horizontalHeader().hide()
self.tbl_phone_numbers.itemChanged.connect(self.update_phone_table)
def update_phone_table(self,item):
print(item.text())
item.setForeground(QColor(255,0,0))
我遇到的问题是编辑列时,连接器被调用了两次。我不确定这是信号触发两次,这是设计原因还是我没有使用正确的信号。基本上,当编辑QTableViewItem时,我需要一个update_phone_table
方法(一次)。
答案 0 :(得分:1)
这是预期的行为,因为在
def update_phone_table(self,item):
print(item.text())
item.setForeground(QColor(255,0,0))
item.setForeground(QColor(255,0,0))
更改了项目,因此再次发出itemChanged()
。
如果您注释掉item.setForeground(QColor(255,0,0))
,您将看到print(item.text())
仅被打印一次。
如果您坚持“在编辑QTableViewItem时调用update_phone_table方法(一次)”,则可以这样阻止信号:
def update_phone_table(self,item):
print(item.text())
self.tbl_phone_numbers.blockSignals(True)
item.setForeground(QColor(255,0,0))
self.tbl_phone_numbers.blockSignals(False)