Уведомления

Группа в Telegram: @pythonsu

#1 Июль 10, 2017 12:21:46

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

Как сделать, чтобы на виджете рисовался элипс при нажатии левой кнопки мыши? Если мы захотим просто нарисовать эллипс то напишем так

 
def paintEvent(self, e):
self.paint.begin(self)
self.drawEllipse()
self.end()
Но я не понимаю как связать paintEvent и mousePressEvent, может быть для этого просто не подойдёт класс QPainter?

Офлайн

#2 Июль 10, 2017 12:48:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

 def mousePressEvent(self,e):
    self.update() #или self.repaint()

Офлайн

#3 Июль 10, 2017 13:05:39

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

vic57
 import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt

class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(500,500)
self.show()
def paintEvent(self, e):
self.paint = QPainter()
self.paint.begin(self)

def mousePressEvent(self, e):
if e.buttons() == Qt.LeftButton:
self.update()
self.paint.drawEllipse(e.pos().x(), e.pos().y(), 10,10)



app = QApplication(sys.argv)
w = Example()
sys.exit(app.exec_())

Как написать так, чтобы при нажатии на левую кнопку мыши рисовался элипс? .-. (в этом коде ничего не рисуется)
Как я понял функция рисования должна быть между бегин и эндом в paintEvent, но тогда мы будем сами рисовать, а не по нажатию

Отредактировано Hizako (Июль 10, 2017 13:07:28)

Офлайн

#4 Июль 10, 2017 13:40:56

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

 class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.flag = False
        self.initUI()
    def initUI(self):
        self.resize(500,500)
        self.show()
    def paintEvent(self, e):
        if self.flag:
            self.flag = False
            self.paint = QPainter()
            self.paint.begin(self)
# draw 
            self.paint.end()
    def mousePressEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.flag = True
            self.update()
посмотри в примерах
https://github.com/baoboa/pyqt5/tree/master/examples/painting

Отредактировано vic57 (Июль 10, 2017 13:42:39)

Офлайн

#5 Июль 10, 2017 13:43:19

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки


vic57
Написал вот это
import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtCore import Qt

class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.x=10
self.y = 10
def initUI(self):
self.resize(500,500)
self.show()

def paintEvent(self, e):
self.paint = QPainter()
self.paint.begin(self)
self.x += 10
self.y += 10
self.paint.drawEllipse(self.x,self.y, 10, 10)
self.paint.end()
def mousePressEvent(self, e):
if e.buttons() == Qt.LeftButton:
self.update()



app = QApplication(sys.argv)
w = Example()
sys.exit(app.exec_())

Просто, чтобы потестить update, круг рисуется, но уничтожается, когда рисуется новый, хотелось бы, чтобы он остался. И ещё как рисовать именно по координатам мышки? Как я понял получить их можно только в mouse событиях .-.

Офлайн

#6 Июль 10, 2017 13:49:46

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

vic57
import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QMouseEvent
from PyQt5.QtCore import Qt

class Example(QWidget):
def __init__(self):
super().__init__()
self.flag = False
self.initUI()
def initUI(self):
self.resize(500,500)
self.show()
def paintEvent(self, e):
if self.flag:
self.flag = False
self.paint = QPainter()
self.paint.begin(self)
self.paint.drawEllipse(self.x, self.y,10,10)
self.paint.end()
def mousePressEvent(self, e):
if e.button() == Qt.LeftButton:
self.flag = True
self.x=e.pos().x()
self.y=e.pos().y()
self.update()

app = QApplication(sys.argv)
w = Example()
sys.exit(app.exec_())

Использовал ваш пример, рисует круги по клику мышки, но круги так же уничтожаются, не знаете как сделать, чтобы круги оставались и продолжали рисоваться, пока кнопка мыши зажата?

Офлайн

#7 Июль 10, 2017 14:05:07

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

обычно рисуют в QPixmap где нужно, а по событию paintEvent делают QPainter.drawPixmap()

Офлайн

#8 Июль 10, 2017 14:17:48

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

vic57
ai
Понял, спасибо, буду пробовать.

Офлайн

#9 Июль 10, 2017 14:27:35

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

Hizako
вообще для таких вещей лучше QGraphicsScene использовать

Прикреплённый файлы:
attachment paint.zip (19,5 KБ)

Офлайн

#10 Июль 10, 2017 15:46:19

Hizako
Зарегистрирован: 2017-03-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt5 Рисование по клику мышки

vic57
Hizakoвообще для таких вещей лучше QGraphicsScene использовать
Спасибо, чекну. Уже написал то, что нужно было через QImage
 import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QMouseEvent, QImage
from PyQt5.QtCore import Qt
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.flag = False
        self.initUI()
    def initUI(self):
        self.resize(500,500)
        self.image = QImage(self.width(), self.height(), QImage.Format_ARGB32)
        self.image.fill(QColor(255,255,255))
        self.show()
    def mousePressEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.flag = True
            self.paint = QPainter(self.image)
            self.ellips(e)
    def paintEvent(self, e):
        paint = QPainter(self)
        paint.drawImage(0,0, self.image)
    def mouseMoveEvent(self, e):
        if self.flag:
            print(e.pos())
            self.ellips(e)
    def ellips(self,e):
        self.paint.setBrush(QColor('black'))
        self.paint.drawEllipse(e.pos(), 10,10)
        self.update()
app = QApplication(sys.argv)
w = Example()
sys.exit(app.exec_())

Вроде бы QImage наследуется от QGraphicsScene поэтому проблем быть не должно.
Ещё раз большое спасибо.

Отредактировано Hizako (Июль 10, 2017 15:47:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version