Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Михалыч
1011 / 355 / 59
Регистрация: 28.02.2013
Сообщений: 937

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

18.11.2019, 12:44. Показов 1019. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru