Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Рисование в PyQt

#python #qt #python_3x #pyqt4


В приложении создано окно, написанное в PyQt4 на Python 3.3. Я создаю переопределение
события paintEvent и рисую, например, эллипс:
def paintEvent(self, event):
    self.paint_ = QtGui.QPainter(self)
    self.paint_.setPen(QtGui.QPen(QtGui.QColor("#000"), 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap))
    self.paint_.setBrush(QtGui.QBrush(QtGui.QColor("#fc6c2d"), QtCore.Qt.SolidPattern))

    self.paint_.drawEllipse(300, 300, 500, 500)

    self.paint_.end()

Как я понял - рисование при помощи QPainter возможно только в области события paintEvent.
В таком случае возникает вопрос - если, например, мне необходимо "дорисовать" к уже
имеющемуся виду, например, линию - как это возможно сделать?
Я нашел не очень хороший, но все же выходи из ситуации (при помощи if конструкций
и вызова события 
def NewLine(p1, p2):
    self.newLine = True
    self.P = [p1, p2]
    self.repaint()

def paintEvent( ... ):
    ...
    if newLine:
        self.paint.drawLine(self.P[0][0], self.P[0][1], self.P[1][0], self.P[1][1]
    ...
)

Но качество этого велосипеда по прежнему оставляет желать лучшего. Есть ли иной способ
"дорисовки"?    


Ответы

Ответ 1



Надо создать несколько методов, которые и будут рисовать. И их вызывать из paintEvent. Пример: def paintEvent(self, e): self.sk = QtGui.QPainter() self.sk.begin() self.drawBack() self.drawStars() self.sk.end() def drawBack(self): #, qp): white_pen = QtGui.QPen(QtGui.QColor('white'), 3) self.sk.setPen(white_pen) self.sk.setBrush(QtGui.QColor('midnightblue')) self.sk.drawRect(0, 0, self.width(), self.height()) def drawStars(self): self.sk.setPen(QtGui.QColor('white')) size = self.size() for i in range(10): x = random.randint(1, size.width()-1) y = random.randint(1, size.height()-1) self.sk.drawPoint(x, y)

Ответ 2



Тыкаете на окно и в нем рисуются круги. Алгоритм простой -- все фигуры рисуем на QImage, а в событии рисования просто отрисовываем QImage: import sys from PyQt4 import QtGui from PyQt4 import QtCore class Widget(QtGui.QWidget): def __init__(self): super().__init__() self.setFixedSize(300, 300) self._im = QtGui.QImage(self.width(), self.height(), QtGui.QImage.Format_ARGB32) self._im.fill(QtGui.QColor("white")) def mouseReleaseEvent(self, event): super().mouseReleaseEvent(event) painter = QtGui.QPainter(self._im) painter.setPen(QtGui.QPen(QtGui.QColor("#000000"), 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap)) painter.setBrush(QtGui.QBrush(QtGui.QColor("#fc6c2d"), QtCore.Qt.SolidPattern)) painter.drawEllipse(event.pos(), 10, 10) # Перерисуемся self.update() def paintEvent(self, event): super().paintEvent(event) painter = QtGui.QPainter(self) painter.drawImage(0, 0, self._im) app = QtGui.QApplication(sys.argv) widget = Widget() widget.setWindowTitle('simple') widget.show() sys.exit(app.exec_()) Когда-то делал рисовалку на python3 + PySide (модуль для работы с Qt, аналог PyQt4). Возможно, пригодится :)

Комментариев нет:

Отправить комментарий