С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
3 / 2 / 1
Регистрация: 02.05.2014
Сообщений: 92

PyQt4 Создание геометрических фигур и закрашивание их

21.03.2016, 00:44. Показов 8543. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtGui import QPainter, QColor, QPen
 
class ColorDialog(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        
        color = QtGui.QColor(0, 0, 0)
        
        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('ColorDialog')
        
    
        
       
        
        self.button = QtGui.QPushButton('Dialog', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.button.move(1,30)
        
        
        
        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showDialog)
        self.setFocus()
        
        
        
        self.widget = QtGui.QWidget(self)
        self.widget.setStyleSheet("QWidget { background-color : %s } "
            % color.name())
        self.widget.setGeometry(130, 22, 100, 100)
        
        self.button = QtGui.QPushButton('Pym', self)
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.button.move(1,1)    
    
    
        self.connect(self.button, QtCore.SIGNAL('clicked()'), self.showPym)
        self.setFocus()    
   
        
      
    def showDialog(self):
        color = QtGui.QColorDialog.getColor()
        
        
        self.widget.setStyleSheet("QWidget  { background-color: %s}"
          % color.name())
 
 
 
         
    
    def showPym(self):
        
        paint = QtGui.QPainter()
        paint.begin(self.viewport())
 
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor('#d4d4d4')
        paint.setPen(color)
 
        paint.setBrush(QtGui.QColor(255, 0, 0, 80))
        paint.drawRect(10, 15, 90, 60)
 
      
        paint.end()
        
   
 
    
app = QtGui.QApplication(sys.argv)
cd = ColorDialog()
cd.show()
 
app.exec_()
Добавлено через 2 минуты
Помогите разобраться, нужно чтобы при нажатии на кнопку рисовалась геометрическая фигура и была возможность изменить её заливку.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2016, 00:44
Ответы с готовыми решениями:

Создание геометрических фигур в паскале.
Здравствуйте. Я только начинаю работать в Паскале, поэтому не удивляйтесь столь глупому вопросу. Мне очень хотелось бы узнать как...

Создание геометрических фигур и их изменение
Доброго времени суток, натолкнулся на проблему, которая, быть может, банальна, но всё же ввела меня в затруднение. Суть программы такова,...

Создание геометрических фигур Python 3.4 Win7 x64
Есть необходимость рисования простых геометрических фигур (без создания собственного окна, как в Tkiner) в рабочем окне сторонней...

17
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 13:17
Какая фигура?
Обычно перед рисованием у устройства устанавливают кисть, которая QBrush.

Чтобы менять - это уже надо делать объекты, наследники QAbstractGraphicsShapeItem. Там есть метод setBrush.
На чём рисуете-то? QGraphicsScene я у вас не заметил.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 13:18
Цитата Сообщение от dondublon Посмотреть сообщение
На чём рисуете-то? QGraphicsScene я у вас не заметил.
Рисовать можно на любом виджете.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 13:20
Цитата Сообщение от Avazart Посмотреть сообщение
Рисовать можно на любом виджете.
Можно, но зачем?

QGraphicsScene хорошо приспособлен, именно для того, что топикстартеру нужно. Рисовать и на принтере можно (в смысле, соответствующем ему объекте), но вот поменять цвет фигуры там уже сложновато.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 13:26
Цитата Сообщение от Avazart Посмотреть сообщение
Рисовать можно на любом виджете.
Рисовать надо в методе paint виждета.
Что бы принудительно перерисовать виджет(применить изменение цвета) нужно вызывать метод update() виджета на котором рисуешь.

Добавлено через 21 секунду
Цитата Сообщение от dondublon Посмотреть сообщение
QGraphicsScene хорошо приспособлен,
Для манипуляции объектами в первую очередь, а рисовать можно на любом виджете.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 13:36
Цитата Сообщение от Avazart Посмотреть сообщение
Рисовать надо в методе paint виждета.
Не надо. Можно, но не надо
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 13:51
Почему нет?

К примеру в Python3 PyQt5 это так будет выглядеть, все просто:

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
#!-*-coding:utf-8-*-
import sys
 
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import uic
 
(Ui_MainWindow, QMainWindow) = uic.loadUiType('MainWindow.ui')
 
 
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.fill_color = Qt.red
        self.ui.pushButton.clicked.connect(self.on_push_button_click)
 
    def __del__(self):
        self.ui = None
 
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setBrush(QBrush(self.fill_color))
        rect = QRectF(10.0, 20.0, 80.0, 60.0)
        painter.drawRect(rect)
        painter.end()
 
    def on_push_button_click(self):
        self.fill_color = Qt.blue if self.fill_color== Qt.red else Qt.red
        self.update()
#-----------------------------------------------------#
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 13:53
Цитата Сообщение от Avazart Посмотреть сообщение
Почему нет?
Потому что не объектно и не феншуйно.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 13:58
Ну или такой пример
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
#!-*-coding:utf-8-*-
import sys
 
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import uic
 
(Ui_MainWindow, QMainWindow) = uic.loadUiType('MainWindow.ui')
 
 
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.rect1 = QRect(10, 20, 80, 60)
        self.rect2 = QRect(100, 20, 80, 60)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.fill_color = Qt.red
        self.ui.pushButton.clicked.connect(self.on_push_button_click)
 
    def __del__(self):
        self.ui = None
 
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setBrush(QBrush(self.fill_color))
        painter.drawRect(self.rect1)
        painter.drawRect(self.rect2)
        painter.end()
 
    def on_push_button_click(self):
        self.fill_color = Qt.blue if self.fill_color == Qt.red else Qt.red
        self.update(self.rect1)
#-----------------------------------------------------#


Цитата Сообщение от dondublon Посмотреть сообщение
Потому что не объектно и не феншуйно.
Объектно нужно делать когда есть объекты, ради одной фигуры разворачивать сцену феншуйно?
При чем никто не мешает прорисовку "объектной" но тут предпосылок для объектности я пока не вижу.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 14:02
Цитата Сообщение от Avazart Посмотреть сообщение
Или более простое объяснение по тому что просто руки...
Ну если переопределять метод paint, когда можно не переопределять - это "руки", да.

Цитата Сообщение от Avazart Посмотреть сообщение
Объектно нужно делать когда есть объекты.
А он есть. QAbstractGraphicsShapeItem и наследники. Ребята из Qt старались, делали, чтобы вам хорошо и удобно было, и сделали прекрасно, а вы не оценили. Тху.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 14:06
Цитата Сообщение от dondublon Посмотреть сообщение
Ну если переопределять метод paint, когда можно не переопределять - это "руки", да.
Из пушки по воробьям.
Еще раз рисовать можно на любом виджете.
Графическая сцена предназначена для более сложных случаев, когда предполагается не только рисование но и манипуляции, когда есть предпосылки для объектности, когда элементов больше чем один, когда объекты комбинируются взаимодействуют, масштабируются, перетаскиваются, прокручиваются итп.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 14:19
Цитата Сообщение от Avazart Посмотреть сообщение
Из пушки по воробьям.
Всё норм. Надо использовать специально созданные для задачи инструменты.

Цитата Сообщение от Avazart Посмотреть сообщение
Графическая сцена предназначена для более сложных случаев, когда предполагается не только рисование но и манипуляции,
Вот именно. У нас - манипцляция, изменение цвета.

Цитата Сообщение от Avazart Посмотреть сообщение
когда есть предпосылки для объектности,
У нас есть. Объект - фигура, у неё свойство - цвет.

Цитата Сообщение от Avazart Посмотреть сообщение
, когда элементов больше чем один,
Это точно. Один объект так можно, 5 - уже коряво. Пусть сразу привыкает.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 14:56
Цитата Сообщение от dondublon Посмотреть сообщение
Вот именно. У нас - манипцляция, изменение цвета.
Манипуляция это перетаскивание изменение положение/вложности обработка нажатий мыши, клавиатуры , соударение и прочие.
А это детский лепет. Никто не запрещает использовать QGraphicsScene это также можно решить с помощью него, все зависит от задачи и перспективы развития, требований и простоты проекта.

Цитата Сообщение от dondublon Посмотреть сообщение
Один объект так можно, 5 - уже коряво. Пусть сразу привыкает.
Еще раз у нас один объект, и это даже не объект по сути ибо он один, ему не с чем взаимодействовать нет смысла его выделять. И опять если выделять это не обязательно должна быть QGraphicsScene все зависит от задачи.
Когда ТС поставит задачу иначе и ответ будет иной.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 15:27
Цитата Сообщение от Avazart Посмотреть сообщение
Манипуляция это перетаскивание изменение положение/вложности обработка нажатий мыши, клавиатуры , соударение и прочие.
Манипуляция в широком смысле - это изменения чего угодно. Не обязательно положения, можно и цвет.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.03.2016, 15:33
Это то что я имел ввиду, ну или управления/менеджмент тонкости перевода и условности.
В любом случае когда речь идет об одной переменной это не серьезно. Очевидно что граф.сцена представляет куда более мощные возможности чем нужно для решения поставленной задачи.

И оф. доки:
The QGraphicsScene class provides a surface for managing a large number of 2D graphical items.
QGraphicsScene also provides functionality that lets you efficiently determine both the location of items, and for determining what items are visible within an arbitrary area on the scene. With the QGraphicsView widget, you can either visualize the whole scene, or zoom in and view only parts of the scene.
http://doc.qt.io/qt-5/qgraphicsscene.html#details или перевод старой доки http://doc.crossplatform.ru/qt... scene.html
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
21.03.2016, 16:05
Вот с graphics scene:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MainWindow(QtGui.QWidget):
    colors = [(0, 0, 0), (128, 128, 0)]
    def __init__(self):
        super(MainWindow, self).__init__()
        lay = QtGui.QVBoxLayout()
        self.setLayout(lay)
        lay = self.layout()
        gs = QtGui.QGraphicsScene()
        gw = QtGui.QGraphicsView(gs)
        lay.addWidget(gw)
 
        btn = QtGui.QPushButton('Push me!')
        btn.clicked.connect(self.on_btn_click)
        lay.addWidget(btn)
 
        self.color_idx = 0
        # добавляем фигуру
        self.rect = gs.addRect(100, 100, 100, 100)
 
    def on_btn_click(self):
        self.color_idx = (self.color_idx +1) % len(self.colors)
        self.rect.setBrush(QtGui.QBrush(QtGui.QColor(*self.colors[self.color_idx])))
Не думаю, что это сложнее.
0
3 / 2 / 1
Регистрация: 02.05.2014
Сообщений: 92
23.03.2016, 21:36  [ТС]
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
from PyQt4 import QtGui, QtCore
 
 
class MainWindow(QtGui.QWidget):
    colors = [(0, 0, 0), (128, 128, 0)]
    
    
    
    
    
    def __init__(self):
        super(MainWindow, self).__init__()
        lay = QtGui.QVBoxLayout()
        self.setLayout(lay)
        lay = self.layout()
        gs = QtGui.QGraphicsScene()
        gw = QtGui.QGraphicsView(gs)
        lay.addWidget(gw)
        color = QtGui.QColor(0, 0, 0)
        
        
        mybutton1=QtGui.QPushButton('Elips', self)
        self.rect = gs.addEllipse(100, 100,150,100)
        mybutton1.clicked.connect(self.on_btn_click)
        mybutton1.setGeometry(10, 10, 35, 60)
        lay.addWidget(mybutton1)
        
        self.color_idx = 0
       
        
   
        
        
            
        
        self.show()
            
    def on_btn_click(self):
        self.color_idx = (self.color_idx +1) % len(self.colors)
        self.rect.setBrush(QtGui.QBrush(QtGui.QColor(*self.colors[self.color_idx])))
          
app =QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
Добавлено через 14 минут
Спасибо за помощь!, а если мне нужно будет создать несколько кнопок и при нажатии на них рисовать разные фигуры? как быть?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
24.03.2016, 07:28
Цитата Сообщение от Senum Посмотреть сообщение
а если мне нужно будет создать несколько кнопок и при нажатии на них рисовать разные фигуры? как быть?
До этого вам надо было нарисовать фигуру при запуске, а раскрасить - при нажатии.

Но вообще не вижу проблем сделать по аналогии. Вы же заменили addRect на addEllipse, значит, ключевой момент поняли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2016, 07:28
Помогаю со студенческими работами здесь

Создание классов геометрических фигур, рисование на GDI (MFC)
Нужно создать класс Shape, как некий родительский класс геометрических фигур, от которого будут наследоваться последующие конкретные...

Создание классов геометрических фигур и метода их "полета"
Помогите, пожалуйста, с заданием: Объекты - геометрические фигуры на экране. С ними работает метод, реализующий свободный (хаотический)...

Закрашивание фигур точками
помогите плз создать программу случайного закрашивания точками круга, прямоугольника, ромба. с прямоугольником справился, а дальше -...

Закрашивание фигур (алгоритм короеда)
Помогите с алгоритмом короеда. Не могу никак написать данный алгоритм...

Закрашивание фигур: соотношение размеров с обводимой фигурой
Здравствуйте. Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru