Как реагировать на нажатие фигур в QGraphics PyQt5?

Имеется PyQt5 программа, строящая QGraphic-поле и эллипс на этом поле. Данному эллипсу присвоено свойство Selectable, при нажатии мышкой он выделяется, но вот как сделать обработку данного выделения, не знаю. То есть, чтобы при клике на данный эллипс возвращался, сигнал что ли, который бы говорил, что такой-то эллипс был нажат.
Скажите, пожалуйста, как это можно сделать?

Вид программы:

введите сюда описание изображения

Код: (всё действие происходит в классе FormBuilder)

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QLineEdit, QFormLayout, QGroupBox, \
    QRadioButton, QMainWindow, QWidget, QGridLayout, QApplication, QGraphicsScene, QGraphicsView, QGraphicsItem
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QPen

WINDOW_HEIGHT = 150
WINDOW_WIDTH = 600
WINDOW_NAME = 'QGraphics Test'


class FormBuilder(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.create_qgraphics()
        self.create_layers()

    def create_qgraphics(self): # создаем и настраиваем QGraph
        self.background_graph_scene = QGraphicsScene()
        self.brush = QBrush(Qt.green)
        self.pen = QPen(Qt.red)
        self.graphic_view = QGraphicsView(self.background_graph_scene)
        self.graphic_view.setGeometry(0, 0, 10, 10)

        # добавляем эллипс для примера и делаем его selectable
        ellipse = self.background_graph_scene.addEllipse(20, 20, 50, 50, self.pen, self.brush)
        ellipse.setFlag(QGraphicsItem.ItemIsSelectable)

    def create_layers(self): # подключаем QGraph к Grid
        main_layout = QVBoxLayout(self)

        background_image_layout = QHBoxLayout()
        background_image_layout.addWidget(self.graphic_view)
        main_layout.addLayout(background_image_layout)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.build_skeleton_with_basic_settings()
        self.create_and_connect_grid()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
        self.setWindowTitle(WINDOW_NAME)

    def create_and_connect_grid(self):
        self.main_grid = QGridLayout(self.centralWidget)
        form_builder_object = FormBuilder()
        self.main_grid.addWidget(form_builder_object, 0, 0, Qt.AlignTop)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

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

Автор решения: Spatz

Можно подключиться к сигналу сцены selectionChanged

import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QVBoxLayout,  \
    QMainWindow, QWidget, QGridLayout, QApplication, QGraphicsScene, QGraphicsView, QGraphicsItem
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QPen

WINDOW_HEIGHT = 150
WINDOW_WIDTH = 600
WINDOW_NAME = 'QGraphics Test'


class FormBuilder(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.create_qgraphics()
        self.create_layers()

    def handleSelection(self):
        ss = self.background_graph_scene.selectedItems()
        if (len(ss) == 0):
            print('пусто')
        else:
            for s in ss:
                print(s.boundingRect())

    def create_qgraphics(self):  # создаем и настраиваем QGraph
        self.background_graph_scene = QGraphicsScene()
        self.background_graph_scene.selectionChanged.connect(
            self.handleSelection)
        self.brush = QBrush(Qt.green)
        self.pen = QPen(Qt.red)
        self.graphic_view = QGraphicsView(self.background_graph_scene)
        self.graphic_view.setGeometry(0, 0, 10, 10)

        # добавляем эллипс для примера и делаем его selectable
        ellipse = self.background_graph_scene.addEllipse(
            20, 20, 50, 50, self.pen, self.brush)
        ellipse.setFlag(QGraphicsItem.ItemIsSelectable)

        ellipse2 = self.background_graph_scene.addEllipse(
            120, 20, 50, 50, self.pen, self.brush)
        ellipse2.setFlag(QGraphicsItem.ItemIsSelectable)

    def create_layers(self):  # подключаем QGraph к Grid
        main_layout = QVBoxLayout(self)

        background_image_layout = QHBoxLayout()
        background_image_layout.addWidget(self.graphic_view)
        main_layout.addLayout(background_image_layout)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)

        self.build_skeleton_with_basic_settings()
        self.create_and_connect_grid()

    def build_skeleton_with_basic_settings(self):
        self.setFixedSize(WINDOW_WIDTH, WINDOW_HEIGHT)
        self.setWindowTitle(WINDOW_NAME)

    def create_and_connect_grid(self):
        self.main_grid = QGridLayout(self.centralWidget)
        form_builder_object = FormBuilder()
        self.main_grid.addWidget(form_builder_object, 0, 0, Qt.AlignTop)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

Или если хочется отлавливать сами клики, то создать кастомный QGraphicsItem и переопределить метод mousePressEvent

→ Ссылка