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

时间:2018-04-06 19:31:08

标签: python-3.x qt pyqt5

我正在尝试在主窗口上画一个点,但是没有显示点。

我尝试将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 个答案:

答案 0 :(得分:0)

您应该只在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_())