You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:53:13