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

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

21.03.2016, 00:44. Показов 8588. Ответов 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.03.2016, 13:17
Какая фигура?
Обычно перед рисованием у устройства устанавливают кисть, которая QBrush.

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

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

Добавлено через 21 секунду
Цитата Сообщение от dondublon Посмотреть сообщение
QGraphicsScene хорошо приспособлен,
Для манипуляции объектами в первую очередь, а рисовать можно на любом виджете.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.03.2016, 13:36
Цитата Сообщение от Avazart Посмотреть сообщение
Рисовать надо в методе paint виждета.
Не надо. Можно, но не надо
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.03.2016, 13:53
Цитата Сообщение от Avazart Посмотреть сообщение
Почему нет?
Потому что не объектно и не феншуйно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.03.2016, 14:02
Цитата Сообщение от Avazart Посмотреть сообщение
Или более простое объяснение по тому что просто руки...
Ну если переопределять метод paint, когда можно не переопределять - это "руки", да.

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

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

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

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

Цитата Сообщение от dondublon Посмотреть сообщение
Один объект так можно, 5 - уже коряво. Пусть сразу привыкает.
Еще раз у нас один объект, и это даже не объект по сути ибо он один, ему не с чем взаимодействовать нет смысла его выделять. И опять если выделять это не обязательно должна быть QGraphicsScene все зависит от задачи.
Когда ТС поставит задачу иначе и ответ будет иной.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
21.03.2016, 15:27
Цитата Сообщение от Avazart Посмотреть сообщение
Манипуляция это перетаскивание изменение положение/вложности обработка нажатий мыши, клавиатуры , соударение и прочие.
Манипуляция в широком смысле - это изменения чего угодно. Не обязательно положения, можно и цвет.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru