Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。

上示的图片黑色键盘是一个独立的Widget的子类CKeyboardForm,白色的背景部分是一个独立的主窗口。现在要实现在白色背景上任意点击某一位置即可实现虚拟键盘的收起,很显然这里就要通过CKeyboardForm来截取全局的鼠标(触摸屏)点击事件,并在代码的监视处实现以上的功能,这就是事件过滤的方法。实现一个事件的过滤包括两个步骤
1.在目标对象上调用installEventFilter(),注册监视对象。
2.在监视对象的EventFilter()函数中处理目标对象的事件。
注册监视对象的位置是在CKeyboardForm的构造函数当中:CKeyboardForm::CKeyboardForm(QWidget parent)
: QWidget(parent)
{
m_lstCharacterBtn.clear();
m_eCurrentMode = InputMode::en;
m_bUpperMode = false;
m_iSymbolPage = 0;
QDesktopWidget
desktopWidget = QApplication::desktop();

//global capture
qApp->installEventFilter(this);
}

事件过滤器注册之后,发送到qApp的事件首先到达CKeyboardForm::eventFilter()函数,然后在到达最终的目的地。
下面是eventFilter()的代码。
bool CKeyboardForm::eventFilter(QObject *watched, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent *>(event);
if(mouseEvent->buttons() == Qt::LeftButton)
{
QPoint pos = mouseEvent->globalPos();

if(pos.y() <= 450)
{
//qDebug()<<“x=”<<pos.x()<<“y=”<<pos.y()<<endl;
emit clicked_tran();
}

}
}

return QWidget::eventFilter(watched, event);
}
如果事件是鼠标事件的话,把Event转换成MouseButtonPress,当确定了鼠标点击后,或者当下鼠标点击位置的绝对坐标,然后通过绝对坐标的纵坐标判断是否激发相关信号。
/
Qt 的事件处理有5中级别:

  1. 重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
  2. 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
  3. 给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
  4. 给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。
  5. 继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。
    许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。
    下图显示了一个键盘事件在一个对话框中从子控件到父控件的传播过程。当用户敲击一个键盘,时间首先发送到有焦点的控件上(这个例子中是QCheckBox)。如果QCheckBox没有处理这个事件,Qt把事件发送到QGroupBox中,如果仍然没有处理,则最后发送到QDialog中。

上诉例子说明的是第四种情况(给QApplication安装事件过滤器),下面给出第五种情况(继承QApplication,重写notify())的伪代码,一起学习。

//.h文件

#ifndef MYQAPPLICATION_H
#define MYQAPPLICATION_H

#include
#include

class CMyApplication : public QApplication
{
Q_OBJECT

public:
CMyApplication(int &argc, char **argv);
~CMyApplication();

bool notify(QObject *, QEvent *);

};
#endif

//.cpp文件
#include “MyQApplication.h”
#include

CMyApplication::CMyApplication(int &argc, char **argv):QApplication(argc,argv)
{

}

CMyApplication::~CMyApplication()
{

}

bool CMyApplication::notify(QObject *obj, QEvent *e)
{
const QMetaObject *objMeta = obj->metaObject();
QString clName = objMeta->className();

if(e->type() == QEvent::MouseButtonPress)
{QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(e);if(mouseEvent->buttons() == Qt::LeftButton){qDebug()<<"left"<<endl;}}
return QApplication::notify(obj,e);

}

//main函数
#include
#include
#include “myapplication.h”
int main(int argc, char *argv[])
{
//注意此处是用myApplication构造不是QApplication
myApplication a(argc, argv);

QWidget  w;
w.show();return a.exec();

}

QT之鼠标事件的全局捕获相关推荐

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

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

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

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

  3. Qt:鼠标事件(鼠标移动事件、鼠标按下事件、鼠标释放事件、进入窗口区域、离开窗口区域)

    鼠标事件,本质是重写重写QWidgt中虚函数. 以下程序是获取鼠标坐标: mylabel.h #ifndef MYLABEL_H #define MYLABEL_H #include <QLab ...

  4. Qt 运用鼠标绘制多边形

    文章目录 Qt 鼠标绘制多边形 技术要点: 实现过程: Qt 鼠标绘制多边形 分析: Qt鼠标绘图,就是要捕获鼠标事件,将捕获到的坐标点传递给场景,然后场景中就可以添加响应的2D图形了. 技术要点: ...

  5. html 透明层禁止点击事件,(转)CSS3之pointer-events(屏蔽鼠标事件)属性说明

    我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的. 但有时 ...

  6. (转)CSS3之pointer-events(屏蔽鼠标事件)属性说明

    我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的. 但有时 ...

  7. 【Qt教程】3.1 - Qt5 event事件、Label控件的鼠标事件捕获

    1. event简介 事件(event)是由系统或者Qt本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键 ...

  8. Qt实现全局鼠标事件监听器-Linux

    Qt实现全局鼠标事件监听器-Linux版

  9. Qt实现全局鼠标事件监听器-Windows

    Qt实现全局鼠标事件监听器-Windows版

最新文章

  1. 网络协议分层_接口测试之网络分层和数据
  2. python分析nginx日志,每分钟nginx请求超过10ms的比例
  3. linux系统配置之开机启动过程(centos)
  4. 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法
  5. 【Python】箱图boxplot--统计数据、观察数据利器
  6. 博士申请 | 阿联酋阿布扎比人工智能大学许志强老师招收全奖博士/硕士
  7. Linux 进程详解
  8. linux下 最常用基本命令
  9. [GCN] 图卷积知识梳理 -持续更新
  10. 工程思想——继电器特性抖动处理
  11. Object强转为实体类类型失败!!!!!!
  12. spark 的RDD各种转换和动作
  13. 封装常用的js(base.js)——【05】自定义弹出框.封装水平垂直居中center(),和resize() ....
  14. 安装SVN时提示错误:vcredist 2019 download
  15. 根据字幕自动配音的软件 如何自动识别语音识别语音生成字幕
  16. 超全回顾 | 5位抖音工程师揭秘抖音iOS基础技术(附PPT和回放视频)
  17. Google SketchUp SDK
  18. 【转】理解分布式账本技术: 经济学视角
  19. 软件分享之浏览器部分
  20. 谷歌浏览器f12功能修改服务器代码,Chrome(谷歌)控制台,console实用教程

热门文章

  1. 前端工程师——思维导图
  2. Diffe_Hellman(迪菲-赫尔曼)算法
  3. 企业仓库管理系统(数据库设计与开发)
  4. Java天之痕第二章攻略_轩辕剑参外传:天之痕主线详细攻略大全
  5. 博途v13中多重背景的建立
  6. 第十二篇:Unity与UE4的通信机制(二):UE4与UE4通信
  7. alibaba fastjson生成的嵌套json串带反斜杠
  8. python需要数学知识吗_入门机器学习到底需要多少数学知识
  9. 大数据Python基础——第一章 搭建环境
  10. phpExcel导出excel打不开问题