Найти - Пользователи
Полная версия: PyQt5 Рисование по клику мышки
Начало » GUI » PyQt5 Рисование по клику мышки
1
Hizako
Как сделать, чтобы на виджете рисовался элипс при нажатии левой кнопки мыши? Если мы захотим просто нарисовать эллипс то напишем так
 
def paintEvent(self, e):
self.paint.begin(self)
self.drawEllipse()
self.end()
Но я не понимаю как связать paintEvent и mousePressEvent, может быть для этого просто не подойдёт класс QPainter?
vic57
 def mousePressEvent(self,e):
    self.update() #или self.repaint()

Hizako
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, но тогда мы будем сами рисовать, а не по нажатию
vic57
 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
Hizako

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 событиях .-.
Hizako
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_())

Использовал ваш пример, рисует круги по клику мышки, но круги так же уничтожаются, не знаете как сделать, чтобы круги оставались и продолжали рисоваться, пока кнопка мыши зажата?
vic57
обычно рисуют в QPixmap где нужно, а по событию paintEvent делают QPainter.drawPixmap()
Hizako
vic57
ai
Понял, спасибо, буду пробовать.
vic57
Hizako
вообще для таких вещей лучше QGraphicsScene использовать
Hizako
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 поэтому проблем быть не должно.
Ещё раз большое спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB