一:基础知识

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. python保存代码_python操作文件读写新增保存代码
  2. python批量提取word指定内容_使用python批量读取word文档并整理关键信息到excel表格的实例...
  3. Python 动态生成多维数组
  4. debian 使用 systemctl 且自启frp
  5. 表单开发(一):获取文本框和密码框数据 用户登录网页
  6. Redis缓存数据库服务器
  7. 文本字段和表单设计-UI组件系列
  8. 使用opensll的md5对于string进行加密
  9. Linux驱动(11)--生成设备节点
  10. Laravel测试驱动开发--功能测试
  11. IOS控件内容 对齐方式
  12. PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码
  13. JAVA循环结构、break、continue、循环嵌套
  14. vivo S10 PRO怎么解锁vivoS10解锁平台刷机教程屏幕锁激活手机锁不记得了可以用这个方法教程重装系统固件软件程序使用方法流程
  15. iOS APP 如何做才安全
  16. 基于51单片机中文汉字LCD12864滚动显示屏仿真(源码+仿真+全套资料)
  17. WIN10访问linux分区「ext2fsd」
  18. 苹果cmsV10资源采集插件
  19. 机械制图之零件图表达
  20. CODESYS 控制虚拟单轴运动

热门文章

  1. 森川机器人自动化_天津森川机器人自动化有限公司邀请您参加天津工博会—自动化展...
  2. HTML5触摸界面的程序设计
  3. 【日积月累】出生日期如何转换成年龄进行显示
  4. HALCON intensity (Operator)
  5. android驱动开发工程师,android驱动开发工程师
  6. 遇到了,要懂得珍惜..
  7. 做银行家里的数据专家:ING探索大数据时代下的金融最佳实践
  8. yum本地源 baseurl repodata repomd.xml comps.xml
  9. 17-分析Ajax请求--爬取易烊千玺微博【以及简单的数据分析】
  10. 精读《sqorn 源码》