You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5如何在鼠标点击位置绘制圆点?

PyQt5主窗口无法绘制圆点的解决方案

你遇到的问题在PyQt5开发里挺常见的,主要是没摸透QMainWindow的结构特性和绘制逻辑的细节。我先帮你梳理下核心问题,再给你一个能正常运行的完整示例。

你当前代码的潜在问题

  • 绘制层级冲突:QMainWindow默认自带一个central widget(中心部件),它是主窗口的核心显示区域,绘制层级会覆盖主窗口本身的绘制内容。如果你直接在QMainWindow的paintEvent里画点,内容会被中心部件挡住,自然看不到。
  • 缺少重绘触发:就算你关联了鼠标点击事件,如果没调用update()方法触发重绘,paintEvent不会主动重新执行,新的点也就没法被绘制出来。
  • 画笔细节问题:默认的QPen宽度是1,绘制的点可能小到肉眼难以分辨,这也会让你误以为点没被成功绘制。

完整解决方案代码

我重新写了一个可运行的版本,核心思路是创建一个自定义的绘制部件,把绘制和鼠标事件都放在这个部件里,再将它设为主窗口的中心部件:

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

class DrawWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.click_points = []  # 存储所有鼠标点击的坐标

    def paintEvent(self, event):
        # 先调用父类的paintEvent,确保部件的基础绘制正常
        super().paintEvent(event)
        
        # 创建QPainter对象,开始绘制流程
        painter = QtGui.QPainter(self)
        # 设置画笔:红色,宽度5(确保圆点足够显眼)
        painter.setPen(QtGui.QPen(QtCore.Qt.red, 5))
        
        # 遍历所有记录的点,逐个绘制
        for point in self.click_points:
            painter.drawPoint(point)

    def mousePressEvent(self, event):
        # 记录当前鼠标点击的位置
        self.click_points.append(event.pos())
        # 触发重绘,让paintEvent重新执行,绘制新的点
        self.update()

class GUI(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # 如果你的gui.ui文件已经定义了中心部件,可以调整这里的逻辑
        # 这里我们直接创建自定义绘制部件作为中心部件
        self.draw_area = DrawWidget()
        self.setCentralWidget(self.draw_area)
        
        # 保留你原来的固定窗口大小逻辑
        self.setFixedSize(self.size() if hasattr(self, 'size') else QtCore.QSize(800, 600))
        self.show()

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

代码关键说明

  • 自定义绘制部件:DrawWidget继承自QWidget,专门负责处理绘制和鼠标事件,彻底避免了和主窗口其他部件的层级冲突。
  • 坐标记录与重绘:click_points列表保存所有用户点击的位置,每次点击后调用update(),通知Qt重新执行paintEvent,确保新的点能被及时绘制。
  • 画笔显式设置:把画笔宽度设为5,解决了默认点太小看不见的问题,你也可以根据需求调整颜色和宽度。

如果你的gui.ui文件里已经有其他布局或部件,只需要把DrawWidget添加到合适的布局位置即可,不用直接设为中心部件。

内容的提问来源于stack exchange,提问作者notEmissary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:35:27