pyqt 删除当前 重新 画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pyqt 删除当前 重新 画相关的知识,希望对你有一定的参考价值。

参考技术A 。 Python删除当前的话,直接把画面直接删除编辑清除,重新画就好了。 参考技术B Py xt删除当前的画面的话,必须把画面重新删除,重新整理的话就可以了。

PyQt5 - 如何在鼠标点击位置上画一个点?

【中文标题】PyQt5 - 如何在鼠标点击位置上画一个点?【英文标题】:PyQt5 - How to draw a dot on mouse click position? 【发布时间】:2018-04-06 19:31:07 【问题描述】:

我正在尝试在主窗口上绘制一个点,但该点未显示。

我尝试将mousePressEvent 绑定到paintEvent,但效果不佳。这是我的代码的当前版本(也不起作用)。我也尝试使用drawPoint 方法放置一个点,但它也不起作用。

import sys
from PyQt5 import QtWidgets, QtGui, QtCore, uic


class GUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('gui.ui', self)
        self.setFixedSize(self.size())
        self.show()

    def mousePressEvent(self, e):
        print(e.pos())
        qp = QtGui.QPainter()
        qp.begin(self)
        qp.setPen(QtCore.Qt.red)
        qp.drawEllipse(e.pos().x(), e.pos().y(), 10, 10)
        qp.end()
        self.update()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = GUI()
    sys.exit(app.exec_())

我知道mousePressEvent 正在工作,因为我得到了点击的坐标。

我可以更改放置点的方法或放置点的类型,但它应该具有可自定义的颜色和大小。

【问题讨论】:

【参考方案1】:

您应该只在 paintEvent 方法内进行绘制,并且此绘制不会节省内存,因此如果您想绘制多个点,您必须将它们存储在某个容器中,例如使用 QPolygon

每次调用update()repaint()时都会调用paintEvent(),例如每次调整大小、移动窗口等时都会调用它。

import sys
from PyQt5 import QtWidgets, QtGui, QtCore, uic


class GUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('gui.ui', self)
        self.setFixedSize(self.size())
        self.show()
        self.points = QtGui.QPolygon()

    def mousePressEvent(self, e):
        self.points << e.pos()
        self.update()

    def paintEvent(self, ev):
        qp = QtGui.QPainter(self)
        qp.setRenderHint(QtGui.QPainter.Antialiasing)
        pen = QtGui.QPen(QtCore.Qt.red, 5)
        brush = QtGui.QBrush(QtCore.Qt.red)
        qp.setPen(pen)
        qp.setBrush(brush)
        for i in range(self.points.count()):
            qp.drawEllipse(self.points.point(i), 5, 5)
        # or 
        # qp.drawPoints(self.points)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = GUI()
    sys.exit(app.exec_())

【讨论】:

谢谢。这对我帮助很大。但是,如果我有 10,000 个点,那么每次更新视图时都将它们全部绘制出来对系统来说会不会有点重? 您应该尝试鼓励用户使用搜索框,而不是发布一次又一次提出问题的答案。 @notEmissary 您应该绘制到图像以用作缓存,并且在绘制事件中只需将图像粘贴到小部件上。这样,您只有在需要更改表示时才进行重绘。

以上是关于pyqt 删除当前 重新 画的主要内容,如果未能解决你的问题,请参考以下文章

CAD梦想画图如何进行重画绘图模式

PyQt QListView 拖放问题,用于在一个列表中导入和重新排列

在pyqt QTreeView中选择行和列

PyQt:重新创建小部件

PyQt:QListView 拖放重新排序信号问题

重新加载 PyQt5 应用程序而不先重新启动它