PyQt5 - 如何在鼠标单击位置绘制一个点?

3
我试着在主窗口上画一个点,但是点没有显示出来。
我已经尝试将 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个回答

3

您应该在paintEvent方法中进行绘制,而这个绘画并不会保存内存,因此如果要绘制多个点,则必须将它们存储在某些容器中,例如使用QPolygon

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

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
2
你应该鼓励用户使用搜索框,而不是回答那些已经被问过很多次的问题。 - dtech
1
@notEmissary,你应该绘制一个图像作为缓存,然后在绘制事件中将图像简单地绘制到小部件上。这样,只有在需要更改表示时才进行繁重的绘制。 - dtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接