PyQt5:如何在绘制新线条时保留已绘制的图形与线条?
解决PyQt5绘制新线条丢失旧线条的问题
这个问题我之前也碰到过!核心原因是PyQt的paintEvent每次触发时都会清空窗口重绘,如果你只保存了当前要画的单条线,之前的自然就会被清除。解决思路很简单——把所有要画的线条都存起来,每次重绘的时候把它们全部画一遍就行。
下面是修改后的完整代码,我补全了你没写完的部分,关键修改点都标出来了:
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): super().__init__() self.setFixedSize(QSize(400, 300)) # 关键:初始化一个列表来存储所有绘制的线条 self.lines = [] # 创建第一个按钮,点击绘制第一条线 btn1 = QPushButton("绘制线条1", self) btn1.move(20, 20) btn1.clicked.connect(self.draw_line1) # 创建第二个按钮,点击绘制第二条线 btn2 = QPushButton("绘制线条2", self) btn2.move(120, 20) btn2.clicked.connect(self.draw_line2) def draw_line1(self): # 创建第一条线,添加到线条列表 line = QLine(QPoint(50, 100), QPoint(350, 100)) self.lines.append(line) # 触发重绘 self.update() def draw_line2(self): # 创建第二条线,添加到线条列表 line = QLine(QPoint(50, 200), QPoint(350, 200)) self.lines.append(line) # 触发重绘 self.update() def paintEvent(self, event): painter = QPainter(self) pen = QPen(Qt.black, 2) painter.setPen(pen) # 关键:遍历线条列表,绘制所有存储的线条 for line in self.lines: painter.drawLine(line) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
关键修改说明:
- 维护线条列表:在
__init__里初始化self.lines = [],用来保存所有已经绘制的线条,而不是只存当前的一条。 - 添加线条到列表:每个按钮的点击事件里,创建新的
QLine对象后,把它追加到列表中,而不是覆盖之前的线条。 - 重绘所有线条:在
paintEvent中,遍历整个线条列表,把每一条线都绘制出来,这样每次重绘时,所有历史线条都会被重新渲染,不会丢失。
这样修改后,不管你点击多少次按钮,所有绘制过的线条都会一直保留在窗口上啦!
内容的提问来源于stack exchange,提问作者riyadude
相关产品推荐
相关产品推荐

