原理就是通过mousemove获取鼠标实时位置,存储到列表中,调用paintevent进行绘制即可。
看代码:
.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPainter>
#include <QMenu>struct myPoint
{QPoint point;QPoint movePoint;int m_r;int m_g;int m_b;
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void CreateMenu();protected:void paintEvent(QPaintEvent *event);void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);public slots:void onDeleteClicked();void onColorClicked();private:bool m_bCliked=false;QPoint m_Point;QPoint m_movePoint;QMenu *m_pMenu=nullptr;QFont m_Font;QList<myPoint> pointList;int m_R=255;int m_G=0;int m_B=0;};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include <QMouseEvent>
#include <qdebug.h>
#include <QTimer>
#include <QTime>
#include <QMenu>
#include <QAction>
#include <QColorDialog>Widget::Widget(QWidget *parent): QWidget(parent)
{this->resize(800,600);CreateMenu();m_Font.setPointSize(5);m_Font.setFamily("Microsoft YaHei");
}Widget::~Widget()
{}void Widget::CreateMenu()
{m_pMenu=new QMenu(this);QAction *clearAction=new QAction(tr("Clear"),this);QAction *colorAction=new QAction(tr("Color"),this);m_pMenu->addAction(colorAction);m_pMenu->addSeparator();m_pMenu->addAction(clearAction);connect(clearAction,&QAction::triggered,this,&Widget::onDeleteClicked);connect(colorAction,&QAction::triggered,this,&Widget::onColorClicked);
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);painter.setFont(m_Font);for(int i=0;i<pointList.size();i++){myPoint mypoint=pointList[i];QPen pen(QBrush(QColor(mypoint.m_r,mypoint.m_g,mypoint.m_b)),5);painter.setPen(pen);painter.drawLine(mypoint.point.x(),mypoint.point.y(),mypoint.movePoint.x(),mypoint.movePoint.y());}
}void Widget::mousePressEvent(QMouseEvent *event)
{if(event->buttons()==Qt::LeftButton){m_bCliked=true;m_Point=event->pos();}
}void Widget::mouseMoveEvent(QMouseEvent *event)
{if(event->buttons()==Qt::LeftButton&&m_bCliked){m_movePoint=event->pos();m_Point=event->pos();myPoint mypoint;mypoint.point=m_Point;mypoint.movePoint=m_movePoint;mypoint.m_r=m_R;mypoint.m_g=m_G;mypoint.m_b=m_B;pointList.append(mypoint);}update();
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{m_bCliked=false;if(event->button()==Qt::RightButton){m_pMenu->move(mapToGlobal(event->pos()));m_pMenu->show();}}void Widget::onDeleteClicked()
{pointList.clear();update();
}void Widget::onColorClicked()
{QColor color = QColorDialog::getColor(QColor(255,0,0));m_R=color.red();m_G=color.green();m_B=color.blue();
}

效果图:

都1202年,你还相信光吗?欢迎评论区告诉我。
ヾ( ̄▽ ̄)ByeBye

qt实现简易的画图,鼠标事件相关推荐

  1. Qt给控件添加鼠标事件

    处理控件上的鼠标事件,是做界面人机交互经常需要的,本文做一个使用的总结.本文在QLable控件中实验过. 一.在h文件中声明鼠标响应事件处理函数 public:explicit MainWindow( ...

  2. QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)

    最近用Qt软件界面,需要用到mouseMoveEvent,研究了下,发现些问题,分享一下. 在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资 ...

  3. qt linux 鼠标事件,QT学习笔记5:QMouseEvent鼠标事件简介

    一.QMouseEvent的详细描述 首先请注意,Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理. QMouseEvent ...

  4. 2、Qt Project之鼠标事件监控

    鼠标事件监控: 对于鼠标时间监控的相关操作,我们在简历工程的时候需要选择的是QWidget基类,不选择QMainWindow基类,如下所示: Base class:QWidget Step1:我们首先 ...

  5. 【Qt教程】3.1 - Qt5 event事件、Label控件的鼠标事件捕获

    1. event简介 事件(event)是由系统或者Qt本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键 ...

  6. Qt安装事件过滤器、过滤子控件事件、截获控件按键、鼠标事件

    Qt安装事件过滤器.过滤子控件事件.截获控件按键.鼠标事件 Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理. 假设我们有一个C ...

  7. QT之鼠标事件的全局捕获

    Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理. 上示的图片黑色键盘是一个独立的Widget的子类CKeyboardForm, ...

  8. QT 事件系统之QMouseEvent鼠标事件

    概述 在Qt中,鼠标事件被封装成.QMouseEvent对象,QMouseEvent中包含一些参数,用描述鼠标事件. 在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件. ...

  9. VS+QT鼠标事件的一些补充

    一:基础知识 1. 鼠标事件分为四种对应不同的函数(该四个函数均继承于QWidget): (1) 按下Press -> void mouseDoubleClickEvent ( QMouseEv ...

  10. QT界面:重写鼠标事件/实时显示Label中鼠标位置

    为了在QT UI界面的状态栏实时显示鼠标在Label中的位置,需要重写鼠标事件MouseMoveEvent(). 但是MouseMoveEvent为了不过多消耗资源,默认需要鼠标按下捕捉到.因此需要在 ...

最新文章

  1. Redis 高级教程 Redis 基准(3)
  2. ai一个线段多个箭头_AI设计教程:艺术笔制作渐变线条海报的方法是什么
  3. 【转】ubuntu 11.10(32位系统)下编译android源码
  4. Ext JS 6开发实例(一)
  5. 带wiringPi库的交叉编译
  6. [转]可伸缩系统的架构经验
  7. html css 前端实现消息提醒数_自学的福音,web前端学习全套视频教程+最新学习思维导图都在这里...
  8. 网络学习云平台 计算机基础应用,计算机应用基础网络自主学习平台使用说明.doc...
  9. 服务器磁盘扩展容量操作流程
  10. 360手机卫士大数据驱动犯罪打击 配合警方破案成果显著
  11. SQL Server高级查询之数据库设计(E-R模型图)
  12. 部署Django REST Framework服务(Nginx + uWSGI + Django)
  13. 40个令人惊讶的photoshop文字效果教程
  14. 基于xxtea算法文件加密工具
  15. 【MTK AF】Acce/Gyro/PD/Laser Driver Check
  16. 微信开发者工具报错Cannotreadpro ‘getPreloadAdUnitIds‘ of undefinedat Object.dK [as getPreloadAdUnitIds]
  17. 中标麒麟桌面版7.0 u盘安装
  18. Java熔断器比较_线上防雪崩利器——熔断器设计原理与实现
  19. 【PySCF学习1】-分子结构之定义分子
  20. Python 学习第二课:Python要点

热门文章

  1. js基础-19-判断图片加载完成的方法
  2. java怎么把程序写入持久化_如何将DataFrame持久化到Hive表?
  3. 流程生产订单和离散生产订单的区别_离散式生产和流程式生产的区别
  4. android底部显示不出来,Android studio 底部的状态栏不见了如何显示
  5. 2d shader unity 阴影_Unity里实现Sprite Renderer的阴影
  6. springboot 接入京东sdk_【第3期】Springboot:微信公众号分享quot;朋友圈quot;
  7. oracle exists替换,oracle 优化or 替换为in、exists、union all的几种写法,测试没有问题!...
  8. 缓冲流与打印流(字节与字符)
  9. 计算机模拟泊松分布,R语言进行数值模拟:模拟泊松回归模型的数据
  10. Java学习笔记之设计模式(6)观察者模式