Qt中鼠标事件捕获与Qt对象事件过滤
可以捕获鼠标事件或者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对象事件过滤相关推荐
- QT中鼠标位置获取问题之event-globalPos()与pos()函数
QT中鼠标位置获取问题之event->globalPos()与pos()函数 标签: Qt 2015-01-03 19:41 820人阅读 评论(0) 收藏 举报 分类: Qt 版权声明:本文为 ...
- JavaScript事件冒泡、事件捕获和阻止默认事件
谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. 冒泡篇 先来看一段实例: js: var $input = document. ...
- Qt中鼠标的双击事件和单击事件的实现方式
背景 同一个部件既要响应鼠标单击事件又要响应双击事件,而且两者响应的动作没有交集,跟不存在包含关系(如果双击事件动作包含单击事件的动作,那么只需要将双击事件特有的部分放到mouseDoubleClic ...
- QT中鼠标的绝对位置和相对位置
参考 Qt获取鼠标位置(绝对位置.相对位置) https://blog.csdn.net/owen7500/article/details/51035078/ qt鼠标事件总结(坐标,跟踪,点击判断) ...
- qt linux实现鼠标位置自动移动,【已解决】qt中鼠标能显示但是无法移动
[问题] 在完成了Linux kernel中的对应的一个模拟鼠标的输入设备(input device)easypoint驱动后,验证了该驱动可以正常工作了,输入 cat /dev/input/even ...
- Qt中鼠标滑过控件由箭头变成手型QWidget::setCusor()
qt中,当要实现鼠标进入某个控件区域时,鼠标箭头变为手型效果,可以用函数QWidget::setCursor(),其中该函数原型如下所示:(该代码对于任何继承于QWidget的控件都有效,也就是无论是 ...
- QT中鼠标移动到时会出现小手
style="cursor: pointer"
- Qt中自定义控件拖拽,QT实现拖拽功能--小白友好版
目录 创作背景 开发环境 运行效果 实现原理 1.参考文档 2.主要原理 实现过程 1.首先是重写QLabel 2.第二步是使用自己写的Label类 总结 创作背景 写这篇文章主要有一 ...
- qt中c语言函数发送qt信号,关于c ++:从Qt中的静态类方法发送信号
我正在尝试编写一个静态回调函数,该函数经常从同一类中的另一个静态函数调用. 我的回调函数需要emit一个信号,但是由于某种原因,它根本无法这样做. 我将其放在调试器下,并且slot从不被调用. 但是, ...
- linux的qt中出现error2,Windows下Qt代码出现的错误总结
1:Use multi-arg instead [不要使用一连串的 arg().arg().arg() 了] QString("%1 %2").arg(a).arg(b); // ...
最新文章
- mysql function加速_MySQL - 函数(FUNCTION)
- 真香!使用 Goland 网页版实现真正的云开发
- Hadoop 1.2.1 集群安装一
- C++实现具有[数组]相似特征的类DoubleSubscriptArray
- Angular2升级到Angular4
- php计算字符串散列,php计算字符串的SHA-1散列函数sha1()
- macOS 如何设置壁纸
- iphone相册储存空间已满_苹果iPhone手机存储空间满了怎么办以及解决方法
- MYSQL命令大全自学笔记
- android n刷机,刷机王子先行一步,一加3成功吃上Android N牛轧糖
- APDU命令的结构、处理、常用指令
- 视频笔记:理解 channels - Kavya Joshi
- 项目管理证书PMP的含金量真有那么高?
- java javax.xml.ws_调用webservice的问题 – javax.xml.ws.WebServiceE...
- 内存条是怎么存储数据的?
- nodeJS 网页支付
- 三维模型还原记忆中的老房子!居然是她的毕业作品....
- 批渲染batches与DrawCall的关系
- ㉕霍兰德SA*型如何选择专业?高考志愿填报选专业
- 2021-11-27 2021年煤矿瓦斯抽采最新解析及煤矿瓦斯抽采模拟考试题库
热门文章
- ckplayer ajax,旋风解析
- html添加自动视频播放器,html5教程:[3]video标签轻松添加视频
- 为什么在java中不能创建泛型数组
- WordPress 安装主题时 提示 “无法创建目录”
- mysql 触发器存储过程的区别_MySQL触发器、存储过程实现
- Android studio打包apk
- 【问题7】集群部署时的分布式 session 如何实现?
- MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
- 【LOJ】#6391. 「THUPC2018」淘米神的树 / Tommy
- 7.24实习培训日志-Docker-Compose