@Zippowin

PyQt испускает несколько сигналов в QTableWidget?

Всем привет. В PyQt не ас, только начинаю осваивать. И столкнулся с крайне странным поведением сигналов, которые не в состоянии побороть
Есть виджет QTableWidget с определённой иерархией, который постоянно перезаполняется в зависимости от действий пользователя (если быть точнее - реализован поиск посредством QLineEdit). Элементы таблицы кликабельные. Я подключаю Double-click вот так:
self.ui.tree.itemDoubleClicked.connect(self.connect)

А после узнаю, какой элемент был нажат:
item = self.ui.tree.currentItem()
Это прекрасно работает, только вот после перезаполнения таблицы, испускаемых сигналов на один и тот же элемент становится n+1
То есть, если мы перезаполним таблицу 5 раз, то по нажатию по элементу, 5 раз запустится self.connect.
Я перепробовал всё, что можно
Пытался использовать disconnect до перезаполнения, а после снова connect. Но что бы я не делал, он не коннектится к слоту второй раз.
В интернете нашёл про blockSignal(). Аля, до перезаполнения таблицы вызывать метод с True, а после с False, как-то так:
self.ui.tree.blockSignal(True)
<перезаписываем ...>
self.ui.tree.blockSignal(False)

Но и это ничуть не помогает.
Неужели такая забагованная реализация сигналов в фреймворке? Прошу помочь разобраться
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bbkmzzzz
Вот, накидал, без дублей сигналов, с перезаполнением и т.д.
import sys

from PySide2.QtWidgets import QApplication, QTableWidget, QTableWidgetItem


class Main(QTableWidget):
    def __init__(self):
        super(Main, self).__init__()
        self.setRowCount(10)
        self.setColumnCount(5)

        self.itemDoubleClicked.connect(self.__on_item_double_click)

        self.setEditTriggers(self.EditKeyPressed | self.AnyKeyPressed)

        self.filling_count = 0
        self.refill()

    def __on_item_double_click(self, item: QTableWidgetItem):
        print(f"row:{item.row()} col:{item.column()} item: {item}")
        self.refill()

    def refill(self):
        self.filling_count += 1
        for row in range(self.rowCount()):
            for col in range(self.columnCount()):
                item = QTableWidgetItem(
                    f"row:{row + 1} col:{col + 1} filled: {self.filling_count}"
                )
                self.setItem(row, col, item)
        self.resizeColumnsToContents()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы