一:基础知识

1. 鼠标事件分为四种对应不同的函数(该四个函数均继承于QWidget):

(1) 按下Press -> void mouseDoubleClickEvent ( QMouseEvent * event )
(2) 抬起Release -> void mouseMoveEvent ( QMouseEvent * event )
(3) 移动Move -> void mousePressEvent ( QMouseEvent * event )
(4) 双击Double Click -> void mouseReleaseEvent ( QMouseEvent * event )
重写这四个函数,就能够让自定义控件支持鼠标操作。

2. Qt中用QMouseEvent类来表达一个鼠标事件

   event->pos()  当前的鼠标坐标x, y : 坐标globalX, globalY: 全局坐标(相对于整个屏幕)button: 鼠标左键、右键、中键

3. 鼠标的自定义发射事件

class ...
{signals:void iAmClicked(QPoint pos); //<font color=red size=3> QPoint pos可以是其他数据类型,char、int等,该数据可连同信号一起被传送出去。 </font>

};
当事件发生时,
emit iAmClicked ( pos );
通过emit操作将信号发射出去了。

例:
.h文件中

signals:void selected(int Axis);  //发射行列分析坐标信号

.cpp文件中

void ShowP::mousePressEvent(QMouseEvent * event)        //按下
{int Axis;emit selected(Axis);  //发射事件
}

信号与槽.

// ui.FrameShowP这个一个QWidget窗口
connect(ui.FrameShowP, SIGNAL(selected(int)),this, SLOT(OnSelected(int)));

响应函数.(函数要在.h文件中private slots:先声明)

int mytest::OnSelected(int Axis)  //
{qDebug() << Axis;  //把分析坐标点传入return 0;
}

二:QMainWindow/QWidget内追踪鼠标事件事件(mousePressEvent移动事件补充)

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到移动。

如果要想鼠标不按下时的移动也能捕捉到,需要setMouseTracking(true)(激活整个窗体的鼠标追踪)。

bool mouseTracking; 这个属性保存的是窗口部件跟踪鼠标是否生效。

*如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标按键被按下时,这个窗口部件才会接收鼠标移动事件。

*如果鼠标跟踪生效,如果没有按键被按下,这个窗口部件也会接收鼠标移动事件。

QWidget: 在QWidget窗口中这样使用是没有问题的。
QMainWindow: 即使使用了setMouseTracking(true),在QMainWindow依然无法捕捉到鼠标没有按下的移动,只有在鼠标按下才能捕捉到移动。
QMainWindow中解决办法:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)开启移动监视。然后在把QMainWindow的setMouseTracking(true)开启监视。之后就一切正常了。
原因:CentrolWIdget是QMainWindow的子类,你如果在子类上响应鼠标事件,只会触发子类的mouseMoveEvent,根据C++继承和重载的原理,所以子类也要setMouseTracking(true); 所以如果你想响应鼠标事件的控件被某个父控件包含,则该控件及其父控件或容器也需setMouseTracking(true);

三:Qt QWidget右键菜单实例

.h文件中

  1. 添加对于头文件*);
  2. 在widget.h中声明右键事件处理函数void contextMenuEvent(QContextMenuEvent
  3. 声明右键菜单信号
  4. 按下菜单响应函数声明
#include <QMenu>
#include <QCursor>
#include <QACtion>private:void contextMenuEvent(QContextMenuEvent *);//右键菜单支持private:QAction* Act_Maxsize;QAction* Act_Normal;
private slots:void ADDChange();void XMLChange()

.cpp文件中
1.新建菜单动作信号
2. 建信号与槽(.h文件中先声明响应函数)
3. 右键菜单函数
4. 按下菜单响应函数

Act_Maxsize = new QAction(tr("XML"), this);  //新建信号
Act_Normal = new QAction(tr("SHOW"), this);
connect(Act_Maxsize, SIGNAL(triggered()), this, SLOT(ADDChange())); //信号与槽
connect(Act_Normal, SIGNAL(triggered()), this, SLOT(XMLChange()));void Widget::contextMenuEvent(QContextMenuEvent *) //右键菜单项编辑
{QCursor cur=this->cursor();QMenu *menu=new QMenu(this);menu->addAction(Act_Maxsize); //添加菜单项1menu->addAction(Act_Normal); //添加菜单项2menu->exec(cur.pos()); //关联到光标
}
void Widget::ADDChange()
{qDebug()<<"XML Item Pressed.";
}
void Widget::XMLChange()
{qDebug()<<"SHOW Item Pressed.";
}

参考:http://blog.sina.com.cn/s/blog_98a4dde701013dzh.html

四:Qt 判断鼠标按键(左键和右键区分)

当操作鼠标按键会发现,鼠标按下、抬起、双击信号对于鼠标的左键和右键都能触发,怎么才能更好的区分动作的是左键还是右键。

Qt::MouseButton QMouseEvent::button() const
返回引发事件的按钮。
注意,对于鼠标移动事件,返回的值总是Qt::NoButton。

代表按键类型的枚举变量 enum Qt::MouseButton
Qt::NoButton 0x00000000----------------移动或者未按下 返回 NoButton
Qt::AllButtons 0x07ffffff--------------------左右键全按下 返回 AllButtons
Qt::LeftButton 0x00000001 ------------- 左键全按下 返回 LeftButton
Qt::RightButton 0x00000002 ----------- 右键全按下 返回 RightButton

故可以通过以下方法判断左键操作还是右键操作:

void myWidget::mousePressEvent(QMouseEvent * event) //按下
{if (ev->button() & Qt::LeftButton)  //左键按下{;}if (ev->button() & Qt::RightButton)  //右键按下{;}
}void myWidget::mouseReleaseEvent(QMouseEvent * event) //释放
{if (ev->button() & Qt::LeftButton)  //左键释放{;}if (ev->buttons() & Qt::RightButton)  //右键释放{;}
}
void myWidget::mouseDoubleClickEvent(QMouseEvent * event)  //双击
{if (ev->button() & Qt::LeftButton)  //左键双击{;}if (ev->buttons() & Qt::RightButton)  //右键双击{;}
}

VS+QT鼠标事件的一些补充相关推荐

  1. QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等

    QT mp3音乐播放器实现框架,Qt鼠标事件,网络编程,QSqlite,Json解析,HTTP请求等 框架搭建 UI设计 mp3.h mp3.cpp 隐藏窗口标题 最大化 最小化 关闭 框架搭建 .p ...

  2. Qt 鼠标事件 与 键盘事件

    鼠标事件 鼠标常用的事件可以说有一下几种:鼠标按下.鼠标移动.鼠标移动.鼠标双击和鼠标滚轮事件. 当你想使用他们,需要包含头文件:#include <QMouseEvent> 并重写一下方 ...

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

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

  4. Qt鼠标拖动绘制基本几何图形

    概述 用Qt鼠标事件实现基本几何图形的绘制,支持直线.矩形.圆形.椭圆.后期可以在此基础上进行扩展. 效果图 实现 本示例使用QGraphics体系来实现,因为要移动对象,所以生成的图形必须是一个单独 ...

  5. QMouseEvent鼠标事件简介

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

  6. 【转】QMouseEvent鼠标事件简介

    首先请注意, Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击.释放等操作 ,而对 鼠标滚轮的响应则通过QWheeEvent来处理 . 以下内容来自QMouseEvent的API文档. 1 ...

  7. QT模拟鼠标事件,实现点击双击移动拖拽等

    之前有涉及过一个远程桌面控制的项目,需要传一些指令给远程的电脑,实现简单的桌面点击.移动.拖拉等功能,当时没有时间实现得很好,今天又研究了一下,故此记录. 虽然我用的是QT,但核心涉及的还是系统的AP ...

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

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

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

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

最新文章

  1. 神经网络的学习方式网络传播和图卷积,两者到底什么关系?
  2. Varnish 4.0.3详细配置
  3. 马斯克语出惊人:大部分人没必要活那么长,未来把意识注入机器人实现永生...
  4. java中的多线程(转自http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html)
  5. Yii框架中使用SRBAC作为权限管理模块时遇到的问题
  6. 使用easyexcel导出
  7. Android中获取网络图片的三种方法
  8. Spring动态注入泛型集合Bean
  9. vue传中文标点_vue项目引入第三方高德地图实现标点定位
  10. ssl1500-最短路上的统计【Floyd】
  11. Linux笔记-利用chkconfig创建脚本使得Rabbimq开机自启
  12. 通信原理 | 信道特性及其数学模型
  13. 开热点给电脑消耗大吗_电脑用手机热点上网耗流量多不多
  14. Go 语言到底适合干什么?
  15. flutter11 - 调试程序
  16. Simon的新中文“百万格子”重磅推出
  17. 杨辉三角形【找规律】
  18. 21.VIVO: Visual Vocabulary Pre-Training for Novel Object Captioning
  19. 诺基亚 android系统升级,诺基亚在中国发布的智能手机都已升级至Android 9.0系统...
  20. 赛博大陆的城镇化思考

热门文章

  1. bat脚本中获取上级目录_批处理bat命令 获取当前盘符和当前目录和上级目录的代码...
  2. 超详细如何配置DHCP中继
  3. 把游戏里面的 UI 做成前端组件库会怎么样?
  4. 中国历史上最美的十五位女人
  5. dotnet 读 WPF 源代码笔记 AppDomainShutdownMonitor 的设计
  6. python内置函数返回序列中最大元素_Python 内置函数 ____________ 用来返回序列中的最大元素。_学小易找答案...
  7. 如何利用计算机,怎样利用计算机学习
  8. WIN10右键一直转圈圈
  9. java期末试题c卷_Java编程基础期末考试试卷模板(C)开卷含答案.doc
  10. armneon Intrinsics记录