#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). Возможно, пригодится :)
Комментариев нет:
Отправить комментарий