【问题标题】:PyQt5 - How to draw a dot on mouse click position?PyQt5 - 如何在鼠标点击位置上画一个点?
【发布时间】: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 正在工作,因为我得到了点击的坐标。

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

【问题讨论】:

    标签: python-3.x qt pyqt5


    【解决方案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 您应该绘制到图像以用作缓存,并且在绘制事件中只需将图像粘贴到小部件上。这样,您只有在需要更改表示时才进行重绘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多