一、QMouseEvent的详细描述

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

QMouseEvent类包含了用于描述鼠标事件的参数。

当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。

鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用QWidget::setMouseTracking()函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的QT鼠标事件;

在一个窗口中,当鼠标按键被按下时,QT会自动捕捉鼠标轨迹,鼠标指针所在的父窗口会继续接受鼠标事件,直到最后一个鼠标按键被释放。

二、QMouseEvent的传递

一个鼠标事件包含一些指定的接受标志flag用于指出该事件是否会被接收和处理 ,如果鼠标指针所在的父窗口不接收该事件则可以调用函数ignore()予以忽略;

多个重叠的窗口在实现里好比一个递归的倒立树,鼠标事件会沿着鼠标指针所在的父窗口的链表向上传递,直到某个窗口调用accept()函数进行事件处理,否则该事件将被过滤销毁掉;

如果一个鼠标事件传递给鼠标指针所在的窗口,而该窗口的QT::WA_NoMousePropagation位置为TRUE,则该事件不会通过父窗口继续向上传递。

可以通过函数pos()、x()、y()得知鼠标事件发生时鼠标指针相对于窗口的位置。

如果把移动窗口作为一次鼠标事件,可以通过函数globalPos()返回的全局坐标值避免窗口的抖动。

可以使用QWidget::setEndabled()来开启/关闭对应的窗口是否接受键盘和鼠标事件。

需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:

QWidget::mousePressEvent()
QWidget::mouseReleaseEvent()
QWidget::mouseDoubleClickEvent()
QWidget::mouseMoveEvent()

三、鼠标事件

鼠标事件使用的时候,加头文件

#include <QMouseEvent>

1.鼠标按下事件

void Widget::mousePressEvent(QMouseEvent *event)
{
// 如果是鼠标左键按下
if(event->button() == Qt::LeftButton)
{
···
}
// 如果是鼠标右键按下
else if(event->button() == Qt::RightButton)
{
···
}
}

2.鼠标移动事件 默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发:setMouseTracking(true);

void Widget::mouseMoveEvent(QMouseEvent *event)
{
// 这里必须使用buttons()
if(event->buttons() & Qt::LeftButton) //进行的按位与
{
···
}
}

3.鼠标释放事件

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
···
}

4.鼠标双击事件

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
// 如果是鼠标左键按下
if(event->button() == Qt::LeftButton){ ···
}
}

5.滚轮事件

void Widget::wheelEvent(QWheelEvent *event)
{ if(event->delta() > )// 当滚轮远离使用者时
{
···
}
else//当滚轮向使用者方向旋转时
{
···
}
}

四、键盘事件

键盘事件使用时,加头文件

#include <QKeyEvent>

1.键盘按下事件

void Widget::keyPressEvent(QKeyEvent *event)
{
// 是否按下Ctrl键 特殊按键
if(event->modifiers() == Qt::ControlModifier)
{
// 是否按下M键 普通按键 类似
if(event->key() == Qt::Key_M)
···
}
else
QWidget::keyPressEvent(event); //保存默认事件 //如果是处理两个普通按键,得避免自动重复,释放中也要处理
if(event->key() == Qt::Key_Up)
{
// 按键重复时不做处理
if(event->isAutoRepeat()) return;
// 标记向上方向键已经按下
keyUp = true;
}
else if(event->key() == Qt::Key_Left)
{
if(event->isAutoRepeat()) return;
keyLeft = true;
}
}

2.按键释放事件

void Widget::keyReleaseEvent(QKeyEvent *event)
{
···
//如果是处理两个普通按键,得避免自动重复
if(event->key() == Qt::Key_Up)
{
if(event->isAutoRepeat()) return;
···
}
else if(event->key() == Qt::Key_Left)
{
if(event->isAutoRepeat()) return;
···
}
}

五、常用公有成员函数

1.globalPos()、globalX()、globalY()这三个函数返回的是鼠标指针的全局坐标。


const QPoint & QMouseEvent::globalPos () const
返回鼠标指针的全局坐标值,对于异步窗口系统例如X11这是一个很重要的特性,无论何时移动窗口作为对鼠标事件的响应时,globalPos()返回的当前鼠标指针坐标值和QCursor::pos()的返回值是有区别的,可以通过调用QWidget::mapToGlobal(pos())在窗口坐标和全局坐标系之间进行转换。


int QMouseEvent::globalX () const
返回鼠标事件发生时鼠标指针全局坐标的X值,相当于globalPos.x();


int QMouseEvent::globalY () const
返回鼠标事件发生时鼠标指针全局坐标的Y值,相当于globalPos.y()。


2.pos()、posF()、x()、y()这四个函数返回的是鼠标指针在当前接收鼠标事件的窗口中的位置。


const QPoint & QMouseEvent::pos () const
返回鼠标指针和接受该鼠标事件窗口的相对位置,其中的坐标值为整型;

QPointF QMouseEvent::posF () const
返回鼠标指针在接受该鼠标事件窗口的相对位置,该坐标值用float类型表示可以增加精确度;

int QMouseEvent::x () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的x坐标值,相当与pos().x();

int QMouseEvent::y () const
返回鼠标事件发生时,鼠标指针在当前接收鼠标事件的窗口中位置的y坐标值,相当于pos().y()。

QT学习笔记5:QMouseEvent鼠标事件简介的更多相关文章

  1. Qt事件系统之二:鼠标事件和滚轮事件

    在Qt中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent.鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等,与 QEvent 类的继承关系图 ...

  2. qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

    应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...

  3. Qt 隐藏标题栏 窗口移动 鼠标事件

    摘要 隐藏标题栏 头文件声明鼠标移动虚函数 .cpp文件实现功能 1 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); 无标题栏移动窗体 ...

  4. Qt学习笔记-Widget布局管理

    Qt学习笔记4-Widget布局管理       以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,f ...

  5. QT学习笔记(一)——Helloworld

    QT学习笔记(一)--Helloworld 一.调试的基本方法: Log调试法 --在代码中加入一定的打印语句 --打印程序状态和关键变量的值 断点调试法: --在开发环境中的对应代码行加上断点 -- ...

  6. qt学习笔记(七)之数据库简介(所有支持数据库类型的列表)

    笔者最近用Qt写公司的考勤机.本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手. 废话不 ...

  7. Javascript高级编程学习笔记(63)—— 事件(7)鼠标及滚轮事件

    鼠标与滚轮事件 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备 DOM3级事件中定义了9个鼠标事件: click:在用户单击主鼠标按钮(一般为鼠标左键)或者按下回车时触发,这一点对 ...

  8. QT学习笔记4:QT中GraphicsView编程

    一.QGraphicsScene 1.QGraphicsScene QGraphicsScene继承自QObject,是一个管理图元的容器,与QGraphicsView合用可以在2D屏幕上显示如线.三 ...

  9. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. 管道和xargs区别

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别 NewUserFF 写道: 懒蜗牛Gentoo 写道: 管道是实现“将前面的标准输出作为后面的 ...

  2. aarch64_g4

    golang-github-inconshreveable-muxado-devel-0-0.7.gitf693c7e.fc26.noarch.rpm 2017-02-11 16:47 30K fed ...

  3. c++字节数组转换为整型

    http://bbs.csdn.net/topics/360132089 BYTE data[4]={0x00,0x00,0xe6,0x00};//第一句UINT a11=*(UINT*)data;/ ...

  4. 从源码层次分析asterisk如何产生呼叫

    老规矩,看别人是怎么搞的 http://blog.chinaunix.net/uid-14723273-id-1739552.html over...

  5. 网络协议之NAT穿透

    NAT IPv4地址只有32位,最多只能提供大致42.9亿个唯一IP地址,当设备越来越多时,IP地址变得越来越稀缺,不能为每个设备都分配一个IP地址.于是,作为NAT规范就出现了.NAT(Networ ...

  6. 网络协议之UDP

    前言 TCP协议在不可靠的网络环境上提供了可靠的通信通道,隐藏了大量的底层细节,使应用程序更加简洁.但有些应用并不需要这么高的可靠性,并不需要按序交付,而且TCP为了提高可靠性也增加了延时,在某些对延 ...

  7. 关于SQLserver的索引的一些脚本

    --判断无用的索引: SELECT TOP 30 DB_NAME() AS DatabaseName , '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '[ ...

  8. 常用sql 全记录(添加中)

    -- 数据库SQL总结中........... --SQL分类: (CREATE,ALTER,DROP,DECLARE) ---DDL—数据定义语言(SELECT,DELETE,UPDATE,INSE ...

  9. poj 2369(置换群)

    Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3041   Accepted: 1641 Desc ...

  10. Redis(二)CentOS7安装Redis4.0.10与集群搭建

    一 Redis单机安装 1 Redis下载安装 1.1 检查依赖环境(Redis是C语言开发,编译依赖gcc环境) [root@node21 redis-]$ gcc -v -bash: gcc: c ...