PyQt5:在绘制新图纸时保持先前绘制的图纸/线条

时间:2018-04-22 16:33:45

标签: python pyqt drawing pyqt5 qpushbutton

在绘制新线后,我无法维护以前绘制的线条。现在,如果我单击一个按钮,它将绘制一条线,但是一旦我单击第二个按钮,就会绘制一条新线并删除初始线。我希望两者都存在。

enter image description here

import sys
from PyQt5.QtWidgets import QMainWindow,QPushButton, QApplication
from PyQt5.QtCore import QSize, Qt, QLine, QPoint
from PyQt5.QtGui import QPainter, QPen

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(300, 300)) 

        pybutton = QPushButton('button', self)
        pybutton.clicked.connect(self.draw_line)
        pybutton.resize(100,100)
        pybutton.move(0, 0) 

        pybutton2 = QPushButton('button2', self)
        pybutton2.clicked.connect(self.draw_line)
        pybutton2.resize(100,100)
        pybutton2.move(200, 0) 
        self.line = QLine()

    def draw_line(self):
        button = self.sender()
        x = int(button.x()) + int(button.width())/2
        y = int(button.y())+100
        self.line = QLine(x, y, x, y+100)
        self.update()

    def paintEvent(self,event):
        QMainWindow.paintEvent(self, event)
        if not self.line.isNull():
            painter = QPainter(self)
            pen = QPen(Qt.red, 3)
            painter.setPen(pen)
            painter.drawLine(self.line)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:3)

简短解决方案:

QLine存储在列表中并重绘:

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(300, 300)) 

        pybutton = QPushButton('button', self)
        pybutton.clicked.connect(self.draw_line)
        pybutton.resize(100,100)
        pybutton.move(0, 0) 

        pybutton2 = QPushButton('button2', self)
        pybutton2.clicked.connect(self.draw_line)
        pybutton2.resize(100,100)
        pybutton2.move(200, 0) 
        self.lines = []

    def draw_line(self):
        button = self.sender()
        r = button.geometry()
        p1 = QPoint(r.left() + r.width()/2, r.height())
        p2 = p1+QPoint(0, 100)
        line = QLine(p1, p2)
        if line not in self.lines:
            self.lines.append(line)
            self.update()

    def paintEvent(self,event):
        QMainWindow.paintEvent(self, event)
        painter = QPainter(self)
        pen = QPen(Qt.red, 3)
        painter.setPen(pen)
        for line in self.lines:
            painter.drawLine(line)

长期解决方案:

这些问题已被无数次问过,所以我会花时间扩展并对问题进行一般性的观察,这样我每次都不回答这类问题,所以这个问题 它将得到改进和更新。

paintEvent()是一个处理Qt以执行重新绘制GUI的方法,此方法重绘所有内容,因此绘图不会节省内存,因此您必须存储指令并制作绘图 这些指示。

我建议使用paintEvent()方法来创建自定义小部件,而不是将执行绘制任务的GUI作为主要功能,因为此Qt提供了类QGraphicsViewQGraphicsSceneQGraphicsItem秒。

使用QPainter作为drawLine()fillRect()等的指示重绘的任务消耗资源,如果您想要更有效的实现,则创建{{{ 1}}您必须在必要时进行更新,并使用上述QPixmappaintEvent()中进行重新绘制:

QPixmap