PyQT5. Как передать сигнал из динамически созданного QGraphicsPixmapItem в QTableWidget?

Суть проблемы:

  • имеется модуль 'interface.py' основной, он запускается и в нем построен дизайн окна.
  • так же есть модуль 'classes.py' в нем прописаны классы объектов и в них переопределённые функции.

Есть class MyOBJ(QGraphicsPixmapItem) объекты из этого класса создаются динамически во время выполнения программы и каждый новый объект реагирует на события мыши. Естественно находятся внутри QGraphicsScene и QgraphicsView.

Сокращенный код из classes.py:

class MyOBJ(QGraphicsPixmapItem):
    def __init__(self):
        super().__init__()
        self.setPixmap(QPixmap('dot.png'))
    def mousePressEvent(self, event):
        pass  # тут всякие разные конструкции
    super().mousePressEvent(event)

Есть класс class MyTableFrames(QTableWidget) созданный из него объект находится внутри QDockWidget, который в свою очередь является виджетом главного окна QMainWindow в модуле 'interface.py'

Сокращенный код из classes.py:

class MyTableFrames(QTableWidget):
    def __init__(self):
        super().__init__()
        self.setColumnCount(7500)
        self.horizontalHeader().setDefaultSectionSize(20)
        self.horizontalHeader().setMinimumSectionSize(20)
        self.setRowCount(1)
        self.setSelectionMode(QAbstractItemView.SingleSelection)
        self.setRowHeight(0, 36)
        self.setEditTriggers(QTableWidget.NoEditTriggers)

    def mousePressEvent(self, event):
        print('Ok')
        super().mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        if event.button() == 1:
            self.setItem(self.currentRow(), self.currentColumn(), QTableWidgetItem("•"))
        super().mouseReleaseEvent(event)

Проблема в том, что я не понимаю каким способом передать событие мыши из MyOBJ в MyTableFrames, что бы при клике мышкой по MyOBJ в таблице MyTableFrames заданной ячейке (пусть будет 1) печаталась точка "•" или просто какой-то символ.


Ответы (2 шт):

Автор решения: Павел

Решено!

При объявлении класса виджета таблицы создается пользовательский сигнал (в модуле classes.py):

class MyTableFrames(QTableWidget):
    TF_sign = pyqtSignal()  # сигнал для передачи в граф.вид
    def __init__(self):

Здесь же в этом классе в переопределенное событие мыши прописываю имитацию сигнала:

def mouseReleaseEvent(self, event):
    self.TF_sign.emit()  # создаем сигнал для граф.вида

В главном модуле (interface.py) в блоке main прописываю соединение сигнала таблицы со слотом в граф.виде (через всё дерево предок/потомок):

if __name__ == '__main__':
    App = QApplication(sys.argv)
    window = Window()
    # передаем сигналы в слоты
    window.tl_frames_table.TF_sign.connect(window.graphicView.tab_sel_slot)
    sys.exit(App.exec())

В блоке граф.вида в модуле classes.py прописываю соответствующий слот/функцию:

class MyGraphicsView(QGraphicsView):
    def __init__(self)
    def tab_sel_slot(self):  # слот приема сигнала от таблицы кадров
        print('signal OK')

Передача сигнала между виджетами окна через разные модули/файлы работает как часы.

→ Ссылка
Автор решения: Alexander Chernin

Проблема в том, что я не понимаю каким способом передать событие мыши из MyOBJ в MyTableFrames, что бы при клике мышкой по MyOBJ в таблице MyTableFrames заданной ячейке

Для того, чтобы ваш графический элемент сцены имел возможность испускать сигналы надо его наследовать не только от QGraphicsPixmapItem, но и от QGraphicsObject:

class MyOBJ(QGraphicsObject, QGraphicsPixmapItem):
    clicked = pyqtSignal()
    def __init__(self):
        QGraphicsObject.__init__(self) # self передаем только сюда!
        QGraphicsPixmapItem.__init__(None) # а здесь просто конструируем

    def mousePressEvent(self, event):
        # Испускаем сигнал
        self.clicked.emit()

Далее, как обычно:

myObj = MyOBJ()
myObj.clicked.connect( ... )
→ Ссылка