可以捕获鼠标事件或者Qt对象的事件,去做一些特定的操作。本文介绍Qt鼠标事件的捕获和Qt对象事件的监听捕获。

1、鼠标事件有:鼠标按下、弹起、双击、鼠标移动、鼠标滑轮上下移动。

上面事件对应的函数如下:

(1)鼠标按下:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

(2)鼠标弹起:

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

(3)双击事件:

[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)

(4)鼠标移动事件:

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

(5)鼠标滑轮上下移动事件:

[virtual protected] void QWidget::wheelEvent(QWheelEvent *event)

上面的函数都是虚函数,可以重写对应的事件,对其进行捕获。

QEvent可以和QWheelEvent进行转换,下面例子中会有转换举例。

调用 QEvent::type()可以返回事件的类型,可以根据类型处理特定的特定的操作,截取部分鼠标的事件类型如下:

2、Qt对象的事件过滤器

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

如果此对象已安装为监视对象的事件过滤器,则过滤事件。 在您重新实现此函数时,如果您想过滤掉事件,即停止对其进行进一步处理,请返回 true; 否则返回false。

监听Qt的对象事件,有两步:

(1)Qt安装事件过滤器:void QObject::installEventFilter(QObject *filterObj)

(2)重写eventFilter(QObject *watched, QEvent *event)

demo代码如下:

/QtWidgetsApplication2.h/
#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication2.h"
#include <QMouseEvent>
#include <QWheelEvent>
#include <qdebug.h>
class QtWidgetsApplication2 : public QMainWindow
{Q_OBJECTpublic:QtWidgetsApplication2(QWidget *parent = Q_NULLPTR);protected:void mousePressEvent(QMouseEvent*event);//按下void mouseMoveEvent(QMouseEvent*event);//按下移动void mouseReleaseEvent(QMouseEvent*event);//松开void mouseDoubleClickEvent(QMouseEvent*event);//双击void wheelEvent(QWheelEvent*event);//滚轮bool eventFilter(QObject *obj, QEvent *ev);
private:Ui::QtWidgetsApplication2Class ui;
};/QtWidgetsApplication2.cpp/
#include "QtWidgetsApplication2.h"
#include <QMap>
#include <string>
QtWidgetsApplication2::QtWidgetsApplication2(QWidget *parent): QMainWindow(parent)
{QMap<int64_t, std::string>map1;map1[10] = "string";ui.setupUi(this);ui.pushButton->installEventFilter(this);
}void QtWidgetsApplication2::mousePressEvent(QMouseEvent * event)
{QPoint nPos = event->globalPos();
}void QtWidgetsApplication2::mouseMoveEvent(QMouseEvent * event)
{int nPointX = event->globalX();
}void QtWidgetsApplication2::mouseReleaseEvent(QMouseEvent * event)
{bool bLeft = false;if (event->buttons() == Qt::LeftButton){bLeft = true;}
}void QtWidgetsApplication2::mouseDoubleClickEvent(QMouseEvent * event)
{int nPointY = event->globalY();
}void QtWidgetsApplication2::wheelEvent(QWheelEvent * event)
{QEvent *qEve = static_cast<QEvent*>(event);QMouseEvent *qMouse = static_cast<QMouseEvent*>(qEve);
}bool QtWidgetsApplication2::eventFilter(QObject * obj, QEvent * ev)
{QMouseEvent *qMouse = static_cast<QMouseEvent*>(ev);if (ev->type() == QEvent::Wheel){QRect rt(0,0,50,50);int nMouseX = qMouse->pos().y();int nMouseY = qMouse->pos().x();if (nMouseX < rt.width() && nMouseY < rt.height()) //在该区域不响应鼠标滑轮。{return true;}}if (obj == ui.pushButton) {if (ev->type() == QEvent::KeyPress) {QKeyEvent *keyEvent = static_cast<QKeyEvent*>(ev);qDebug() << "Ate key press" << keyEvent->key();return true;}else {return false;}}else {// pass the event on to the parent classreturn QMainWindow::eventFilter(obj, ev);}
}//main.cpp///
#include "QtWidgetsApplication2.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);QtWidgetsApplication2 w;w.show();return a.exec();
}

demo的.ui文件如下:

demo的Qt工程配置

Qt中绝对位置和相对位置介绍的博文:(2条消息) Qt获取鼠标位置(绝对位置、相对位置)_云鹤起舞的博客-CSDN博客_qt获取鼠标位置

Qt中鼠标事件捕获与Qt对象事件过滤相关推荐

  1. QT中鼠标位置获取问题之event-globalPos()与pos()函数

    QT中鼠标位置获取问题之event->globalPos()与pos()函数 标签: Qt 2015-01-03 19:41 820人阅读 评论(0) 收藏 举报 分类: Qt 版权声明:本文为 ...

  2. JavaScript事件冒泡、事件捕获和阻止默认事件

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. 冒泡篇 先来看一段实例: js: var $input = document. ...

  3. Qt中鼠标的双击事件和单击事件的实现方式

    背景 同一个部件既要响应鼠标单击事件又要响应双击事件,而且两者响应的动作没有交集,跟不存在包含关系(如果双击事件动作包含单击事件的动作,那么只需要将双击事件特有的部分放到mouseDoubleClic ...

  4. QT中鼠标的绝对位置和相对位置

    参考 Qt获取鼠标位置(绝对位置.相对位置) https://blog.csdn.net/owen7500/article/details/51035078/ qt鼠标事件总结(坐标,跟踪,点击判断) ...

  5. qt linux实现鼠标位置自动移动,【已解决】qt中鼠标能显示但是无法移动

    [问题] 在完成了Linux kernel中的对应的一个模拟鼠标的输入设备(input device)easypoint驱动后,验证了该驱动可以正常工作了,输入 cat /dev/input/even ...

  6. Qt中鼠标滑过控件由箭头变成手型QWidget::setCusor()

    qt中,当要实现鼠标进入某个控件区域时,鼠标箭头变为手型效果,可以用函数QWidget::setCursor(),其中该函数原型如下所示:(该代码对于任何继承于QWidget的控件都有效,也就是无论是 ...

  7. QT中鼠标移动到时会出现小手

    style="cursor: pointer"

  8. Qt中自定义控件拖拽,QT实现拖拽功能--小白友好版

    目录 创作背景 开发环境 运行效果 实现原理 1.参考文档 2.主要原理 实现过程 1.首先是重写QLabel 2.第二步是使用自己写的Label类 总结 创作背景         写这篇文章主要有一 ...

  9. qt中c语言函数发送qt信号,关于c ++:从Qt中的静态类方法发送信号

    我正在尝试编写一个静态回调函数,该函数经常从同一类中的另一个静态函数调用. 我的回调函数需要emit一个信号,但是由于某种原因,它根本无法这样做. 我将其放在调试器下,并且slot从不被调用. 但是, ...

  10. linux的qt中出现error2,Windows下Qt代码出现的错误总结

    1:Use multi-arg instead [不要使用一连串的 arg().arg().arg() 了] QString("%1 %2").arg(a).arg(b); // ...

最新文章

  1. mysql function加速_MySQL - 函数(FUNCTION)
  2. 真香!使用 Goland 网页版实现真正的云开发
  3. Hadoop 1.2.1 集群安装一
  4. C++实现具有[数组]相似特征的类DoubleSubscriptArray
  5. Angular2升级到Angular4
  6. php计算字符串散列,php计算字符串的SHA-1散列函数sha1()
  7. macOS 如何设置壁纸
  8. iphone相册储存空间已满_苹果iPhone手机存储空间满了怎么办以及解决方法
  9. MYSQL命令大全自学笔记
  10. android n刷机,刷机王子先行一步,一加3成功吃上Android N牛轧糖
  11. APDU命令的结构、处理、常用指令
  12. 视频笔记:理解 channels - Kavya Joshi
  13. 项目管理证书PMP的含金量真有那么高?
  14. java javax.xml.ws_调用webservice的问题 – javax.xml.ws.WebServiceE...
  15. 内存条是怎么存储数据的?
  16. nodeJS 网页支付
  17. 三维模型还原记忆中的老房子!居然是她的毕业作品....
  18. 批渲染batches与DrawCall的关系
  19. ㉕霍兰德SA*型如何选择专业?高考志愿填报选专业
  20. 2021-11-27 2021年煤矿瓦斯抽采最新解析及煤矿瓦斯抽采模拟考试题库

热门文章

  1. ckplayer ajax,旋风解析
  2. html添加自动视频播放器,html5教程:[3]video标签轻松添加视频
  3. 为什么在java中不能创建泛型数组
  4. WordPress 安装主题时 提示 “无法创建目录”
  5. mysql 触发器存储过程的区别_MySQL触发器、存储过程实现
  6. Android studio打包apk
  7. 【问题7】集群部署时的分布式 session 如何实现?
  8. MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
  9. 【LOJ】#6391. 「THUPC2018」淘米神的树 / Tommy
  10. 7.24实习培训日志-Docker-Compose