PyQt5 QTableWidget сигнальный разъем вызывается дважды - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий код, который заполняет 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))

Проблема, с которой я сталкиваюсь, - когда я редактирую столбец, соединитель вызывается дважды.Я не уверен, если это сигнал срабатывает дважды, это будет дизайн или я не использую правильный сигнал.По сути, мне нужен метод update_phone_table, вызываемый (один раз) при редактировании QTableViewItem.

1 Ответ

0 голосов
/ 11 октября 2018

Это ожидаемое поведение, потому что в

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()) печатается только один раз.

Если вы настаиваете, что «метод update_phone_table вызывается (один раз) при редактировании QTableViewItem», вы можете заблокировать сигнал, напримерэто:

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)
...