PyQt5 QTableWidget信号连接器被调用两次

时间:2018-10-10 20:01:27

标签: python python-3.x pyqt5 qtablewidget

我有以下代码填充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方法(一次)。

1 个答案:

答案 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)