Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937

Как определить какой круг выбран?

18.11.2019, 12:44. Показов 1023. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго дня, подскажите пожалуйста)

Есть программа которая открывает картинку и размещает ее в QPixmap на QGraphicsScene. Есть функция рисования кругов поверх этой картинки:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    def button_draw_circle(self, ev):#функция рисования круга на картинке
        
        
        name_rings = str("item"+str(self.k))
        self.name_rings = QGraphicsEllipseItem(0.0, 0.0, 40.0, 40.0)
        self.name_rings.setPos(QPointF(50.0, 50.0))
        self.name_rings.setFlag(QGraphicsItem.ItemIsMovable)
        self.name_rings.setFlag(QGraphicsItem.ItemIsSelectable)
        self.name_rings.setFlag(QGraphicsItem.ItemIsFocusable)
        self.name_rings.setBrush(QColor(700, 0, 0))
        self.scene.addItem(self.name_rings)
        
        
        self.rings.append(self.name_rings)
        self.k += 1
        
        print(name_rings)#номер круга
        print(self.rings)#круг в списке
        print(self.name_rings.pos())# координаты только что нарисованного круга
Т.е. результатом является, то что на картинке можно создать много кругов, которые можно по ней перетаскивать. Вопрос: если потом их выбирать мышкой то как определить какой круг выбран и его координаты?

Полный код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
 
 
class Example(QWidget):
 
    def __init__(self):
        super().__init__()
 
        self.initUI()
        #self.x = 5
        
 
 
    def initUI(self):
        self.k = 1
        self.scale = 1
 
        
        grid = QGridLayout(self)
        grid.setColumnStretch(0, 7)
        grid.setColumnStretch(1, 1)
        self.scene = QGraphicsScene(self)
        area = QScrollArea(self)
 
        self.rings = []
 
        pixmap = QPixmap("image.jpg")
        self.scene.addPixmap(pixmap)
        
 
        self.view = QGraphicsView(self.scene)
 
        area.setWidget(self.view)
        area.setWidgetResizable(True)
        #self.item.mousePressEvent = self.mouseMoveEvent
 
        btn_paint = QPushButton("Удалить круги",self)
        circle_paint = QPushButton("Нарисовать круги",self)
        scale_view_plus = QPushButton("Увеличить масштаб",self)
        scale_view_min = QPushButton("Уменьшить масштаб",self)
        hand = QPushButton("Включить руку",self)
        shear = QPushButton("Изменить наклон картинки",self)
        
        x_coord = QLineEdit(self)
        y_coord = QLineEdit(self)
        radius = QLineEdit(self)
 
        palette = QPalette()
        palette.setColor(QPalette.Base,Qt.cyan)
        # palette.setColor(QPalette.Text,Qt.white)
        x_coord.setPalette(palette)
 
        btn_paint.clicked.connect(self.button_del_circle) #функция удаления круга с картинки
        circle_paint.clicked.connect(self.button_draw_circle)#функция рисования круга на картинке
        scale_view_plus.clicked.connect(self.button_scale_view_plus)# функция масштаба увеличение
        scale_view_min.clicked.connect(self.button_scale_view_min)# функция масштаба увеличение
        hand.clicked.connect(self.button_hand)# функция руки (визуальное изменение курсора и возможность перетаскивания картинки)
        shear.clicked.connect(self.button_shear)# функция наклона картинки)
 
 
        vbox = QVBoxLayout(self)
        vbox.setContentsMargins(0, 0, 0, 0)
        box = QGroupBox(self) 
        vbox.addWidget(x_coord)
        vbox.addWidget(y_coord)
        vbox.addWidget(radius)
        vbox.addWidget(btn_paint)
        vbox.addWidget(circle_paint)
        vbox.addWidget(scale_view_plus)
        vbox.addWidget(scale_view_min)
        vbox.addWidget(hand)
        vbox.addWidget(shear)
        box.setLayout(vbox)
 
        verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
 
 
        grid.addWidget(area, 0, 0, -1, 1)
        grid.addWidget(box, 0, 1, 1, 1)
        grid.addItem(verticalSpacer, 1, 1, 1, 1)
        
        self.setLayout(grid)
 
 
        self.move(300, 200)
        self.setWindowTitle('Red Rock')
        self.show()
 
    def mouseMoveEvent(self, event):#функция показывать координаты круга (не работает, работает если круг создан в UnitUI
        print(f'Координаты: (), {self.item.pos()}')
 
    def button_del_circle(self, ev):# функция удаления круга с картинки
        if len(self.scene.items()) > 1:
            self.scene.removeItem(self.scene.items()[0])
 
    def button_draw_circle(self, ev):#функция рисования круга на картинке
        
        
        name_rings = str("item"+str(self.k))
        self.name_rings = QGraphicsEllipseItem(0.0, 0.0, 40.0, 40.0)
        self.name_rings.setPos(QPointF(50.0, 50.0))
        self.name_rings.setFlag(QGraphicsItem.ItemIsMovable)
        self.name_rings.setFlag(QGraphicsItem.ItemIsSelectable)
        self.name_rings.setFlag(QGraphicsItem.ItemIsFocusable)
        self.name_rings.setBrush(QColor(700, 0, 0))
        self.scene.addItem(self.name_rings)
        
        
        self.rings.append(self.name_rings)
        self.k += 1
        
        print(name_rings)#номер круга
        print(self.rings)#круг в списке
        print(self.name_rings.pos())# координаты только что нарисованного круга
 
 
    def button_scale_view_plus(self):# функция увеличения масштаба
        self.scale += 0.01
        self.view.scale(self.scale, self.scale)
        print(self.scale)
    def button_scale_view_min(self):# функция уменьшения масштаба
        self.scale -= 0.01
        self.view.scale(self.scale, self.scale)
        print(self.scale)
 
    def button_hand(self):
        if self.view.dragMode() == QGraphicsView.ScrollHandDrag:
            self.view.setDragMode(QGraphicsView.RubberBandDrag)
        else:
            self.view.setDragMode(QGraphicsView.ScrollHandDrag)
 
    def button_shear(self):# функция изменения наклона картинки
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setWindowTitle("Наклон картинки")
        msg.setText("Изменить наклон картинки")
        #msg.setInformativeText("InformativeText")
        #msg.setDetailedText("DetailedText")
  
        okButton = msg.addButton('Да', QMessageBox.AcceptRole)
        msg.addButton('Нет', QMessageBox.RejectRole)
        msg.exec()
        if msg.clickedButton() == okButton:
            self.view.shear(0.0, 0.3)
        else:
            self.view.resetTransform()
 
 
 
def my_excepthook(type, value, tback):
    QMessageBox.critical(
        window, "CRITICAL ERROR", str(value),
        QMessageBox.Cancel
    )
 
    sys.__excepthook__(type, value, tback)
 
 
sys.excepthook = my_excepthook
 
if __name__ == '__main__':
 
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2019, 12:44
Ответы с готовыми решениями:

Как определить, что не выбран ни один Radiobutton?
У меня в коде есть 3 Radiobutton которые связаны одной переменной. При выборе определенного Radiobutton, у меня происходит поиск в...

Как определить какой select выбран
Добрый день есть такая разметка <select name="status" class="form-control"> <option>В...

Как определить в какой строке таблицы выбран checkBox
На этапе инициализации добавляю в каждую строку таблицы QTableWidget (в первый столбец) QCheckBox (точнее добавляю виджет chBoxW, который...

5
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
18.11.2019, 13:56
У QGraphicsScene есть событие selectionChanged, а сами выбранные элементы можно получать методом QGraphicsScene selectedItems()
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
18.11.2019, 14:21  [ТС]
tooru, спасибо) Как теперь с ним работать :
Python
1
[<PyQt5.QtWidgets.QGraphicsEllipseItem object at 0x04470620>]
Вот вернул от мне ту строку, а если дополнительно я хочу получить координаты этого выбранного объекта например?
Как у QGraphicsItem.pos()?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
18.11.2019, 14:33
Цитата Сообщение от Михалыч Посмотреть сообщение
Вот вернул от мне ту строку
Он вернул этот объект, у этого объекта можно получить все свойства
1
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937
18.11.2019, 14:45  [ТС]
получилось)

Python
1
2
3
        print(self.scene.selectedItems())
        a = self.scene.selectedItems()[0].pos()
        print(a)
Еще маленький вопрос почему записать нужно так [0].pos()? Всмыле [0] - зачем?

Добавлено через 43 секунды
Я правильно понял что это индекс первого из выделенных элементов (Items)?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
18.11.2019, 15:05
Цитата Сообщение от Михалыч Посмотреть сообщение
Еще маленький вопрос почему записать нужно так [0].pos()? Всмыле [0] - зачем?
selectedItems, то есть метод возвращает всегда список
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2019, 15:05
Помогаю со студенческими работами здесь

Как определить какой язык выбран в данный момент в Windows?
Как определить какой язык (Русский/Английский) выбран в данный момет в Winde и как програмно его переключать.

Определить какой прямоугольник (многоугольник) выбран на picturebox
Всем доброго времени суток. Имеется массив в котором хранятся точки вершин многоугольников, при этом эти многоугольники представлены...

Select: как узнать какой выбран?
Привет, не знаю как правильно сформулировать вопрос вот код &lt;div class=&quot;form-group&quot;&gt; ...

Как узнать какой элемент выбран?
У меня есть JPanel в ней ещё несколько JPanel, в каждой из которых 1 JLabel и 1 JList, я хочу чтобы по двойному нажатию на JList его рамка...

Как узнать какой value выбран в Dropdown?
На сцене есть Dropdown и 5 неактивных объектов (это не суть) Нужно сделать так: Пока выбран определенный value то будет активен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru