Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 12.11.2019
Сообщений: 12
1
PyQt5

Отрисовка начинается не с точки нажатия мыши Qt painter

21.01.2021, 19:35. Просмотров 2057. Ответов 6

Приветствую, помогите пожалуйста разобраться, почему при рисовании всех фигур (кроме круга и кисточки), например линии, начальная точка нажатия мыши не воспринимается и начало линии рисуется где-то вдоль.

Вот код:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
import sys
 
from PyQt5.QtGui import QBrush, QColor, QPainter
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget# импортируем в библии
from PyQt5 import uic
 
# это класс кисточки, где устанавливается цвет кисти и цвет заполнения
class BrushPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 255, 0)))
        painter.setPen(QColor(0, 255, 0))
        painter.drawEllipse(self.x - 5, self.y - 5, 9, 9)
 
 
# это класс линии также как и кисть только начало и конец кординат это точка мыши
class Line:
    def __init__(self, sy, sx, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))
        painter.setPen(QColor(0, 0, 0))
        painter.drawLine(self.sx, self.sy, self.ex, self.ey)
 
 
# круг и его радиус по формуле
class Circle:
    def __init__(self, cx, cy, x, y):
        self.cx = cx
        self.cy = cy
        self.x = x
        self.y = y
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(0, 255, 0))
        radius = int(((self.cx - self.x) ** 2 + (self.cy - self.y) ** 2) ** 0.5)
        painter.drawEllipse(self.cx - radius, self.cy - radius, radius * 2, radius * 2)
 
 
# прямоугольник формулы не нуны все делает программа
class Rectangle:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(255, 255, 0))
        painter.drawRect(self.sx, self.sy, self.ex, self.ey)
 
 
#  это закругленный прямоугольник все так же как и в простом,только надо указать проценты округления
class RoundedRect:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(255, 255, 0))
        painter.drawRoundedRect(self.sx, self.sy, self.ex, self.ey, 30.0, 15.0)
 
 
# овал полностью на 360 градусов закругленный прямоугольник
class Oval:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(255, 255, 255, 255)))
        painter.setPen(QColor(255, 0, 0))
        painter.drawRoundedRect(self.sx, self.sy, self.ex, self.ey, 360.0, 360.0)
 
 
# арка часть окружности но радиус не нужен
class Arc:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 225, 50)))
        painter.setPen(QColor(255, 0, 0))
        painter.drawArc(self.sx, self.sy, self.ex, self.ey, 30 * 16, 120 * 16)
 
 
# хорда почти не отличается от арки только снизу отображается нижняя часть прямоугольника
class Chord:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 225, 50)))
        painter.setPen(QColor(255, 0, 255))
        painter.drawChord(self.sx, self.sy, self.ex, self.ey, 30 * 16, 120 * 16)
 
 
# основной класс где происходит процесс рисования
class Canvas(QWidget):
    def __init__(self):
        super(Canvas, self).__init__()
 
        self.objects = []  # это массив где находятся все фигуры чтоб не пропали после рисования
        self.instrument = 'brush'  # по умолчанию кисточка
 
    def paintEvent(self,  event):   # основной процесс отрисовки и отображения
        painter = QPainter()
        painter.begin(self)
        for obj in self.objects:
            obj.draw(painter)
        painter.end()
 
    def mousePressEvent(self, event):    # тут происходит чтение данных с помощью курсора мыши
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y()))
            self.update()
        elif self.instrument == 'line':
            self.objects.append(Line(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'circle':
            self.objects.append(Circle(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'rect':
            self.objects.append(Rectangle(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'rounders':
            self.objects.append(RoundedRect(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'oval':
            self.objects.append(Oval(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'arc':
            self.objects.append(Arc(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'chord':
            self.objects.append(Chord(event.x(), event.y(), event.x(), event.y()))
            self.update()
        
    def mouseMoveEvent(self, event):   # тут так же но эта выполняет функции при движении
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y()))
            self.update()
        elif self.instrument == 'line':
            self.objects[-1].ex = event.x()    # чтоб продолжить обращаемся к последнему месту нахождения мыши
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'circle':
            self.objects[-1].x = event.x()
            self.objects[-1].y = event.y()
            self.update()
         [COLOR="Red"][B]вот тут начинаются проблемы с рисованием с начальной точкой мыши[/B][/COLOR]
        elif self.instrument == 'rect':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'rounders':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'oval':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'arc':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'chord':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
 
# тут просто меняем инструменты по нажатию кнопок
    def setBrush(self):
        self.instrument = 'brush'
 
    def setLine(self):
        self.instrument = 'line'
 
    def setCircle(self):
        self.instrument = 'circle'
 
    def setRect(self):
        self.instrument = 'rect'
 
    def setRoundedRect(self):
        self.instrument = 'rounders'
 
    def setOval(self):
        self.instrument = 'oval'
 
    def setArc(self):
        self.instrument = 'arc'
 
    def setChord(self):
        self.instrument = 'chord'
 
 
class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        uic.loadUi('window.ui', self)    # подключения дизайна
 
        self.setCentralWidget(Canvas())    # главный виджет делаем Canvas
 
# тут подключаем кнопочки
        self.action_brush.triggered.connect(self.centralWidget().setBrush)
        self.action_line.triggered.connect(self.centralWidget().setLine)
        self.action_circle.triggered.connect(self.centralWidget().setCircle)
        self.action_rect.triggered.connect(self.centralWidget().setRect)
        self.action_rectangle.triggered.connect(self.centralWidget().setRoundedRect)
        self.action_oval.triggered.connect(self.centralWidget().setOval)
        self.action_arc.triggered.connect(self.centralWidget().setArc)
        self.action_chord.triggered.connect(self.centralWidget().setChord)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2021, 19:35
Ответы с готовыми решениями:

Координаты точки нажатия мыши.
С помощью OpenGL создаю окно. Нужно определить координаты куда я в этом окне кликнул мышкой.

Почему отрисовка начинается не с начала окна?
Ребята объясните пожалуйста. Начал разбираться в openGL. Возник вопрос хочу нарисовать обычную...

Движение мыши с точки А в точку Б с зажатой правой кнопкой мыши
Здравствуйте, мне нужно сделать программу которая бы плавно перемещала курсор мыши из А в Б причем...

Отрисовка квадрата по клику мыши в pictureBox
Здравствуйте. Есть изображение в битмапе, загруженное пользователем. Необходимо по клику мыши...

6
16 / 9 / 7
Регистрация: 01.01.2021
Сообщений: 29
22.01.2021, 14:39 2
извините, но я не могу его запустить. Я установил PyQt5 и получаю сообщение об ошибке при его запуске

Я думаю, ошибка в строке 222

Код
Traceback (most recent call last):
  File "C:\Users\#\Desktop\Python\python_oyun2.py", line 239, in <module>
    wnd = Window()
  File "C:\Users\#\Desktop\Python\python_oyun2.py", line 222, in __init__
    uic.loadUi('window.ui', self)    # подключения дизайна
  File "C:\Users\#\AppData\Roaming\Python\Python39\site-packages\PyQt5\uic\__init__.py", line 238, in loadUi
    return DynamicUILoader(package).loadUi(uifile, baseinstance, resource_suffix)
  File "C:\Users\#\AppData\Roaming\Python\Python39\site-packages\PyQt5\uic\Loader\loader.py", line 66, in loadUi
    return self.parse(filename, resource_suffix)
  File "C:\Users\#\AppData\Roaming\Python\Python39\site-packages\PyQt5\uic\uiparser.py", line 1020, in parse
    document = parse(filename)
  File "C:\Program Files\Python39\lib\xml\etree\ElementTree.py", line 1229, in parse
    tree.parse(source, parser)
  File "C:\Program Files\Python39\lib\xml\etree\ElementTree.py", line 569, in parse
    source = open(source, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'window.ui'
если я смогу запустить его, возможно, я смогу помочь, пожалуйста
0
1 / 1 / 0
Регистрация: 12.11.2019
Сообщений: 12
22.01.2021, 14:51  [ТС] 3
Dr_Balontotis Я забыл ещё файл со стилем вот он: window.ui — Яндекс.Диск
https://yadi.sk/d/0CA4xFIaFgkE-Q
Если с ним запустить заработает
0
16 / 9 / 7
Регистрация: 01.01.2021
Сообщений: 29
22.01.2021, 15:52 4
Лучший ответ Сообщение было отмечено Ilyaxxx как решение

Решение

Ilyaxxx, Я решил ошибку строки, вы написали координаты задом наперед

Цитата Сообщение от Ilyaxxx Посмотреть сообщение
def __init__(self, sy, sx, ex, ey):
def __init__(self, sx, sy, ex, ey):

Так все работает правильно
Я буду искать других

Добавлено через 24 минуты
и вторая ошибка при рисовании чего-либо - это указание конечных размеров вместо ширины и высоты(Возможно, я неправильно перевел это предложение).

Цитата Сообщение от Ilyaxxx Посмотреть сообщение
painter.drawRect(self.sx, self.sy, self.ex, self.ey)
ты : draw(x1, y1, x2, y2)
Я : draw(x1, y1, wigth, heigth) = draw(x1, y1, x2 - x1, y2 - y1)

и это будет последний путь:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
import sys
 
from PyQt5.QtGui import QBrush, QColor, QPainter
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget# импортируем в библии
from PyQt5 import uic
 
# это класс кисточки, где устанавливается цвет кисти и цвет заполнения
class BrushPoint:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 255, 0)))
        painter.setPen(QColor(0, 255, 0))
        painter.drawEllipse(self.x - 5, self.y - 5, 9, 9)
 
 
# это класс линии также как и кисть только начало и конец кординат это точка мыши
class Line:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0)))
        painter.setPen(QColor(0, 0, 0))
        painter.drawLine(self.sx, self.sy, self.ex, self.ey)
 
 
# круг и его радиус по формуле
class Circle:
    def __init__(self, cx, cy, x, y):
        self.cx = cx
        self.cy = cy
        self.x = x
        self.y = y
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(0, 255, 0))
        radius = int(((self.cx - self.x) ** 2 + (self.cy - self.y) ** 2) ** 0.5)
        painter.drawEllipse(self.cx - radius, self.cy - radius, radius * 2, radius * 2)
 
 
# прямоугольник формулы не нуны все делает программа
class Rectangle:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(255, 255, 0))
        painter.drawRect(self.sx, self.sy, self.ex - self.sx, self.ey - self.sy)
 
 
#  это закругленный прямоугольник все так же как и в простом,только надо указать проценты округления
class RoundedRect:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 0, 225)))
        painter.setPen(QColor(255, 255, 0))
        painter.drawRoundedRect(self.sx, self.sy,self.ex - self.sx, self.ey - self.sy, 30.0, 15.0)
 
 
# овал полностью на 360 градусов закругленный прямоугольник
class Oval:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(255, 255, 255, 255)))
        painter.setPen(QColor(255, 0, 0))
        painter.drawRoundedRect(self.sx, self.sy, self.ex - self.sx, self.ey - self.sy, 360.0, 360.0)
 
 
# арка часть окружности но радиус не нужен
class Arc:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 225, 50)))
        painter.setPen(QColor(255, 0, 0))
        painter.drawArc(self.sx, self.sy, self.ex - self.sx, (self.ey - self.sy)*4, 30 * 16, 120 * 16)
 
 
# хорда почти не отличается от арки только снизу отображается нижняя часть прямоугольника
class Chord:
    def __init__(self, sx, sy, ex, ey):
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
 
    def draw(self, painter):
        painter.setBrush(QBrush(QColor(0, 0, 225, 50)))
        painter.setPen(QColor(255, 0, 255))
        painter.drawChord(self.sx, self.sy, (self.ex - self.sx), int((self.ey - self.sy)*4), 30 * 16, 120 * 16)
 
 
# основной класс где происходит процесс рисования
class Canvas(QWidget):
    def __init__(self):
        super(Canvas, self).__init__()
 
        self.objects = []  # это массив где находятся все фигуры чтоб не пропали после рисования
        self.instrument = 'brush'  # по умолчанию кисточка
 
    def paintEvent(self,  event):   # основной процесс отрисовки и отображения
        painter = QPainter()
        painter.begin(self)
        for obj in self.objects:
            obj.draw(painter)
        painter.end()
 
    def mousePressEvent(self, event):    # тут происходит чтение данных с помощью курсора мыши
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y()))
            self.update()
        elif self.instrument == 'line':
            self.objects.append(Line(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'circle':
            self.objects.append(Circle(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'rect':
            self.objects.append(Rectangle(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'rounders':
            self.objects.append(RoundedRect(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'oval':
            self.objects.append(Oval(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'arc':
            self.objects.append(Arc(event.x(), event.y(), event.x(), event.y()))
            self.update()
        elif self.instrument == 'chord':
            self.objects.append(Chord(event.x(), event.y(), event.x(), event.y()))
            self.update()
        
    def mouseMoveEvent(self, event):   # тут так же но эта выполняет функции при движении
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y()))
            self.update()
        elif self.instrument == 'line':
            self.objects[-1].ex = event.x()    # чтоб продолжить обращаемся к последнему месту нахождения мыши
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'circle':
            self.objects[-1].x = event.x()
            self.objects[-1].y = event.y()
            self.update()
        #[COLOR="Red"][B]вот тут начинаются проблемы с рисованием с начальной точкой мыши[/B][/COLOR]
        elif self.instrument == 'rect':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'rounders':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'oval':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'arc':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'chord':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
 
# тут просто меняем инструменты по нажатию кнопок
    def setBrush(self):
        self.instrument = 'brush'
 
    def setLine(self):
        self.instrument = 'line'
 
    def setCircle(self):
        self.instrument = 'circle'
 
    def setRect(self):
        self.instrument = 'rect'
 
    def setRoundedRect(self):
        self.instrument = 'rounders'
 
    def setOval(self):
        self.instrument = 'oval'
 
    def setArc(self):
        self.instrument = 'arc'
 
    def setChord(self):
        self.instrument = 'chord'
 
 
class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        uic.loadUi('window.ui', self)    # подключения дизайна
 
        self.setCentralWidget(Canvas())    # главный виджет делаем Canvas
 
# тут подключаем кнопочки
        self.action_brush.triggered.connect(self.centralWidget().setBrush)
        self.action_line.triggered.connect(self.centralWidget().setLine)
        self.action_circle.triggered.connect(self.centralWidget().setCircle)
        self.action_rect.triggered.connect(self.centralWidget().setRect)
        self.action_rectangle.triggered.connect(self.centralWidget().setRoundedRect)
        self.action_oval.triggered.connect(self.centralWidget().setOval)
        self.action_arc.triggered.connect(self.centralWidget().setArc)
        self.action_chord.triggered.connect(self.centralWidget().setChord)
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
этого достаточно для тебя?
1
1 / 1 / 0
Регистрация: 12.11.2019
Сообщений: 12
22.01.2021, 18:11  [ТС] 5
Dr_Balontotis, А ещё не можешь подсказать как можно организовать изменение цвета фигур
0
16 / 9 / 7
Регистрация: 01.01.2021
Сообщений: 29
22.01.2021, 18:13 6
не волнуйся, я посмотрю ночью
0
16 / 9 / 7
Регистрация: 01.01.2021
Сообщений: 29
23.01.2021, 11:29 7
Ilyaxxx, Я добавил ластик и текстовый инструмент, кроме изменения цвета
Русских букв может не быть на пишущем инструменте
ластик иногда выходит из строя. Я пытался уменьшить
Инструмент Текст имеет заглавные буквы
и немного изменил свой файл для этих дополнений("window.ui")

Отрисовка начинается не с точки нажатия мыши Qt painter


Я добавил один цветовой инструмент
С помощью кода ниже открывается цветной форум и возвращает значение цвета при закрытии
Python
1
color = QColorDialog.getColor()
window.ui:
XML
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="cursor">
   <cursorShape>SizeAllCursor</cursorShape>
  </property>
  <property name="windowTitle">
   <string>Ilyaxxx'in çizim programı</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>291</width>
      <height>31</height>
     </rect>
    </property>
    <property name="acceptDrops">
     <bool>false</bool>
    </property>
    <property name="whatsThis">
     <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;ghdj&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
    <property name="styleSheet">
     <string notr="true">border-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 0, 0, 255), stop:0.166 rgba(255, 255, 0, 255), stop:0.333 rgba(0, 255, 0, 255), stop:0.5 rgba(0, 255, 255, 255), stop:0.666 rgba(0, 0, 255, 255), stop:0.833 rgba(255, 0, 255, 255), stop:1 rgba(255, 0, 0, 255));</string>
    </property>
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Plain</enum>
    </property>
    <property name="lineWidth">
     <number>2</number>
    </property>
    <property name="midLineWidth">
     <number>0</number>
    </property>
    <property name="text">
     <string>Здесь вы можете рисовать с помощью &quot;инструментов&quot;</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>20</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>Инструменты</string>
    </property>
    <addaction name="action_silgi"/>
    <addaction name="action_yazi"/>
    <addaction name="action_brush"/>
    <addaction name="action_line"/>
    <addaction name="action_circle"/>
    <addaction name="action_rect"/>
    <addaction name="action_rectangle"/>
    <addaction name="action_oval"/>
    <addaction name="action_arc"/>
    <addaction name="action_chord"/>
    <addaction name="action_Renk1Sec"/>
    <addaction name="action_Renk2Sec"/>
   </widget>
   <addaction name="menu"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
  <widget class="QToolBar" name="toolBar">
   <property name="cursor">
    <cursorShape>PointingHandCursor</cursorShape>
   </property>
   <property name="windowTitle">
    <string>toolBar</string>
   </property>
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
   <addaction name="action_silgi"/>
   <addaction name="action_yazi"/>
   <addaction name="action_brush"/>
   <addaction name="action_line"/>
   <addaction name="action_circle"/>
   <addaction name="action_rect"/>
   <addaction name="separator"/>
   <addaction name="action_rectangle"/>
   <addaction name="action_oval"/>
   <addaction name="action_arc"/>
   <addaction name="action_chord"/>
   <addaction name="action_Renk1Sec"/>
   <addaction name="action_Renk2Sec"/>
  </widget>
  <action name="action_silgi">
   <property name="text">
    <string>Silgi(erase)</string>
   </property>
  </action>
  <action name="action_yazi">
   <property name="text">
    <string>Yazi(text)</string>
   </property>
  </action>
  <action name="action_brush">
   <property name="text">
    <string>Кисточка</string>
   </property>
  </action>
  <action name="action_line">
   <property name="text">
    <string>Линия</string>
   </property>
  </action>
  <action name="action_circle">
   <property name="text">
    <string>Круг</string>
   </property>
  </action>
  <action name="action_rect">
   <property name="text">
    <string>Прямоугольник</string>
   </property>
  </action>
  <action name="action_red">
   <property name="text">
    <string>Красный</string>
   </property>
  </action>
  <action name="action_green">
   <property name="text">
    <string>Зеленый</string>
   </property>
  </action>
  <action name="action">
   <property name="text">
    <string>Черный</string>
   </property>
  </action>
  <action name="action_rectangle">
   <property name="text">
    <string>Округленный прямоуг.</string>
   </property>
  </action>
  <action name="action_oval">
   <property name="text">
    <string>Овал</string>
   </property>
  </action>
  <action name="action_arc">
   <property name="text">
    <string>Дуга</string>
   </property>
  </action>
  <action name="action_chord">
   <property name="text">
    <string>Хорда</string>
   </property>
  </action>
  <action name="action_Renk1Sec">
   <property name="text">
    <string>Çizim Renk</string>
   </property>
  </action>  
  <action name="action_Renk2Sec">
   <property name="text">
    <string>Çerçeve Renk</string>
   </property>
  </action> 
 </widget>
 <resources/>
 <connections/>
</ui>
python dosyası:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
import sys
 
from PyQt5.QtWidgets import * 
from PyQt5 import QtCore, QtGui 
from PyQt5.QtGui import * 
from PyQt5.QtCore import *
from PyQt5 import uic
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication
 
# Bu yazı konumunun ve rengini oluurulduğu sınıftır
class Yazi:
    def __init__(self, x, y, text, renk1, renk2):
        self.tür = 'yazi'
        self.x = x
        self.y = y
        self.text = text
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk1)
        painter.setFont(QFont('Helvetica', 48))
        painter.drawText(self.x, self.y, self.text)
 
# это класс кисточки, где устанавливается цвет кисти и цвет заполнения
class BrushPoint:
    def __init__(self, x, y, renk1, renk2):
        self.tür = 'brush'
        self.x = x
        self.y = y
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk1)
        painter.drawEllipse(self.x - 5, self.y - 5, 9, 9)
 
 
# это класс линии также как и кисть только начало и конец кординат это точка мыши
class Line:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'line'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawLine(self.sx, self.sy, self.ex, self.ey)
 
 
# круг и его радиус по формуле
class Circle:
    def __init__(self, cx, cy, x, y, renk1, renk2):
        self.tür = 'circle'
        self.cx = cx
        self.cy = cy
        self.x = x
        self.y = y
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        radius = int(((self.cx - self.x) ** 2 + (self.cy - self.y) ** 2) ** 0.5)
        painter.drawEllipse(self.cx - radius, self.cy - radius, radius * 2, radius * 2)
 
 
# прямоугольник формулы не нуны все делает программа
class Rectangle:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'rect'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawRect(self.sx, self.sy, self.ex - self.sx, self.ey - self.sy)
 
 
#  это закругленный прямоугольник все так же как и в простом,только надо указать проценты округления
class RoundedRect:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'rounders'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawRoundedRect(self.sx, self.sy,self.ex - self.sx, self.ey - self.sy, 30.0, 15.0)
 
 
# овал полностью на 360 градусов закругленный прямоугольник
class Oval:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'oval'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawRoundedRect(self.sx, self.sy, self.ex - self.sx, self.ey - self.sy, 360.0, 360.0)
 
 
# арка часть окружности но радиус не нужен
class Arc:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'arc'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawArc(self.sx, self.sy, self.ex - self.sx, (self.ey - self.sy)*4, 30 * 16, 120 * 16)
 
 
# хорда почти не отличается от арки только снизу отображается нижняя часть прямоугольника
class Chord:
    def __init__(self, sx, sy, ex, ey, renk1, renk2):
        self.tür = 'chord'
        self.sx = sx
        self.sy = sy
        self.ex = ex
        self.ey = ey
        self.renk1 = renk1
        self.renk2 = renk2
 
    def draw(self, painter):
        painter.setBrush(QBrush(self.renk1))
        painter.setPen(self.renk2)
        painter.drawChord(self.sx, self.sy, (self.ex - self.sx), int((self.ey - self.sy)*4), 30 * 16, 120 * 16)
 
 
# основной класс где происходит процесс рисования
class Canvas(QWidget):
    def __init__(self):
        super(Canvas, self).__init__()
 
        self.objects = []  # это массив где находятся все фигуры чтоб не пропали после рисования
        self.instrument = 'brush'  # по умолчанию кисточка
        self.renk1 = QColor(255, 0, 255)
        self.renk2 = QColor(255, 0, 255)
 
    def paintEvent(self,  event):   # основной процесс отрисовки и отображения
        painter = QPainter()
        painter.begin(self)
        for obj in self.objects:
            obj.draw(painter)
        painter.end()
 
    def mousePressEvent(self, event):    # тут происходит чтение данных с помощью курсора мыши
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'line':
            self.objects.append(Line(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'circle':
            self.objects.append(Circle(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'rect':
            self.objects.append(Rectangle(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'rounders':
            self.objects.append(RoundedRect(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'oval':
            self.objects.append(Oval(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'arc':
            self.objects.append(Arc(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'chord':
            self.objects.append(Chord(event.x(), event.y(), event.x(), event.y(), self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'yazi':
            self.objects.append(Yazi(event.x(), event.y(), 'q', self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'silgi':
            x = event.x()
            y = event.y()
 
            for i in self.objects:
                if i.tür == 'circle':
                    radius = int(((i.cx - i.x) ** 2 + (i.cy - i.y) ** 2) ** 0.5)
                    if i.cx - radius * 2 < x and x < i.cx and i.cy - radius * 2 < y and y < i.cy:
                        self.objects.remove(i)
                        self.update()
                        break
                    
                elif i.tür == 'brush' or i.tür == 'yazi':
                    if i.x - 5 < x and x < i.x + 5 and i.y - 5 < y and y < i.y + 5:
                        self.objects.remove(i)
                        self.update()
                        break
                    
                elif i.sx < x and x < i.ex and i.sy < y and y < i.ey:
                    self.objects.remove(i)
                    self.update()
                    break            
        
    def mouseMoveEvent(self, event):   # тут так же но эта выполняет функции при движении
        if self.instrument == 'brush':
            self.objects.append(BrushPoint(event.x(), event.y(),self.renk1, self.renk2))
            self.update()
        elif self.instrument == 'line':
            self.objects[-1].ex = event.x()    # чтоб продолжить обращаемся к последнему месту нахождения мыши
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'circle':
            self.objects[-1].x = event.x()
            self.objects[-1].y = event.y()
            self.update()
        #[COLOR="Red"][B]вот тут начинаются проблемы с рисованием с начальной точкой мыши[/B][/COLOR]
        elif self.instrument == 'rect':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'rounders':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'oval':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'arc':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
        elif self.instrument == 'chord':
            self.objects[-1].ex = event.x()
            self.objects[-1].ey = event.y()
            self.update()
 
# тут просто меняем инструменты по нажатию кнопок
    def setSilgi(self):
        self.instrument = 'silgi'
 
    def setYazi(self):
        self.instrument = 'yazi'
 
    def setBrush(self):
        self.instrument = 'brush'
 
    def setLine(self):
        self.instrument = 'line'
 
    def setCircle(self):
        self.instrument = 'circle'
 
    def setRect(self):
        self.instrument = 'rect'
 
    def setRoundedRect(self):
        self.instrument = 'rounders'
 
    def setOval(self):
        self.instrument = 'oval'
 
    def setArc(self):
        self.instrument = 'arc'
 
    def setChord(self):
        self.instrument = 'chord'
 
    def setRenk1(self):
        self.renk1 = QColorDialog.getColor()
 
    def setRenk2(self):
        self.renk2 = QColorDialog.getColor()            
 
class Window(QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        uic.loadUi('window.ui', self)    # подключения дизайна
 
        self.setWindowTitle("Ilyaxxx'in çizim programı v3.0")
        self.canvas = Canvas()
        self.setCentralWidget(self.canvas)    # главный виджет делаем Canvas
        self.capsLck = False
 
# тут подключаем кнопочки
        self.action_silgi.triggered.connect(self.centralWidget().setSilgi)
        self.action_yazi.triggered.connect(self.centralWidget().setYazi)
        self.action_brush.triggered.connect(self.centralWidget().setBrush)
        self.action_line.triggered.connect(self.centralWidget().setLine)
        self.action_circle.triggered.connect(self.centralWidget().setCircle)
        self.action_rect.triggered.connect(self.centralWidget().setRect)
        self.action_rectangle.triggered.connect(self.centralWidget().setRoundedRect)
        self.action_oval.triggered.connect(self.centralWidget().setOval)
        self.action_arc.triggered.connect(self.centralWidget().setArc)
        self.action_chord.triggered.connect(self.centralWidget().setChord)
        self.action_Renk1Sec.triggered.connect(self.centralWidget().setRenk1)
        self.action_Renk2Sec.triggered.connect(self.centralWidget().setRenk2)
 
    def keyPressEvent(self, e):
        if self.canvas.objects[-1].tür == "yazi":
            i = e.key()
            harf = ''
            if i == 32:
                harf = ' '
            if 65 <= i and i <= 90:
                if self.capsLck:
                     harf = chr(i)
                else:
                    harf = chr(i + 32)
            if harf != '': 
                self.canvas.objects[-1].text += harf
                self.canvas.update()
            if e.key() == QtCore.Qt.Key_Backspace:
                if len(self.canvas.objects[-1].text) == 1:
                    self.canvas.objects.remove(self.canvas.objects[-1])
                    self.canvas.update()
                else:
                    self.canvas.objects[-1].text = self.canvas.objects[-1].text[:-1]
                    self.canvas.update()
            if e.key() == QtCore.Qt.Key_CapsLock:
                if self.capsLck:
                    self.capsLck = False
                else:
                    self.capsLck = True
            
 
if __name__ == '__main__':    
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec())
я надеюсь тебе это понравится
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2021, 11:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Отрисовка шахмат + реагирование на клики мыши
Добрый день, делаю шахматы, у меня задача - отрисовать шахматную доску с фигурами + позволить...

Отрисовка линии по клику мыши на область
Нужно нарисовать линии ,когда кликаем на определенную область.Проблема с том что когда я на неё...

Отрисовка спрайта при нажатии кнопки мыши
Добрый день. Нужно, чтобы при нажатии правой кнопки мыши рисовался спрайт с текстуры. Пытался...

Рисование линий от точки до точки при помощи мыши
Нашла задачу, рисует линии, как я поняла от точки до точки. С помощью tasm и tlink делаю exe файл,...

При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой кнопки мыши красный квад
При нажати левой кнопки мыши в месте нажатия отображается зеленый кружок, а при нажатии правой...

WPF canvas отрисовка точки
Здравствуйте уважаемые Форумчане. Может что то не правильно понимаю, так как многого не знаю. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.