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

Posted

技术标签:

【中文标题】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 您应该绘制到图像以用作缓存,并且在绘制事件中只需将图像粘贴到小部件上。这样,您只有在需要更改表示时才进行重绘。

以上是关于PyQt5 - 如何在鼠标点击位置上画一个点?的主要内容,如果未能解决你的问题,请参考以下文章

根据鼠标点击发生tkinter的位置显示一个点

按键精灵鼠标点依次击三个位置,怎么设置

在从 JS 到 PyQt5 的鼠标点击时存储 lat long

如何通过鼠标点击获得鼠标点的三维世界坐标呢?OPENGL

如何在谷歌地图上画线

OpenCV利用鼠标在如下图所示的MFC视频图像上画直线?