Как реагировать на нажатие фигур в 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
