PyQt5 QTableWidget 信号连接器调用两次

PyQt5 QTableWidget signal connector called twice

我有以下填充 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 方法。

这是预期的行为,因为在

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()) 只打印一次。

如果你坚持"the update_phone_table method called (once) when a QTableViewItem is edited",你可以这样屏蔽信号:

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)