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')
Передача сигнала между виджетами окна через разные модули/файлы работает как часы.
Проблема в том, что я не понимаю каким способом передать событие мыши из 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( ... )