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)
我有以下填充 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)