首页 > 其他分享 >Qt-事件过滤器、事件分发器、事件处理器

Qt-事件过滤器、事件分发器、事件处理器

时间:2024-07-13 18:25:33浏览次数:22  
标签:窗口 Qt 函数 事件 QWidget 过滤器 event 鼠标

前言

Qt中事件的处理步骤
1. 当事件产生之后, Qt 应用程序对象通过调用 QApplication::notify() 函数将事件发送到指定的窗口。
2. 事件在发送过程中可以通过向对象(窗口、按钮等)安装事件过滤器 QObject::eventFilter() 来对事件进行过滤。Qt 应用程序默认不对任何产生的事件进行过滤。
3. 当事件发送到指定窗口之后,窗口的事件分发器 QWidget::event() 会对收到的事件进行分类和分发。
4. 事件处理器会对接收到的事件进行处理,每个事件处理器函数都对应唯一的事件,我们可以重写事件处理器函数来修改事件的默认处理动作。 

说明:本文中所有示例的完整代码都在绑定的资源中,审核通过后大家可以免费下载。 

一 事件过滤器 

1. API

1.1 事件过滤器函数
参数1:要过滤的事件的所有者对象
参数2:要过滤的具体的事件
返回值:true - 说明事件被过滤掉了,停止对它的进一步处理;false - 未过滤掉参数2的事件,将对该事件进行下一步处理
[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event);
 

1.2 安装事件过滤器
void QObject::installEventFilter(QObject *filterObj);

2. 使用步骤

假设窗口A上有一个按钮1,想过滤按钮1的事件:

第1步:在 Qt 项目中创建一个窗口A,继承标准的窗口类(QWidget 或其派生类),在窗口中添加一个按钮1,给按钮1安装事件过滤器,将窗口A作为过滤器:按钮1->installEventFilter(窗口A)。

第2步:重写窗口A的事件过滤器函数,在函数里对按钮事件进行处理。

3. 代码示例

//创建一个继承于 QWidget 类的窗口类,在类中添加一个按钮,给窗口安装事件过滤器,过滤掉窗口中按钮的鼠标单击和双击事件:

1. 头文件:
	//重写事件过滤器
    bool eventFilter(QObject *watched, QEvent *event);

2. 源文件:
	
	// 在窗口的构造函数中给窗口中的按钮安装事件过滤器
	ui->pushButton->installEventFilter(this);

	//重写事件过滤器
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    //判断对象是否是窗口中的按钮
    if(watched == ui->pushButton)
    {
        //检测到鼠标单击和双击事件
        if(event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick)
        {
            QMessageBox::information(nullptr, "提示", "过滤掉了窗口中按钮的鼠标单击和双击事件!", QMessageBox::Ok);

            //在本窗口中过滤掉鼠标点击和双击事件
            //返回 true:Qt 认为这个事件已经过滤掉了,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。
            //返回 false:Qt认为这个事件未被过滤掉,会将这个事件传递到父窗口
            return true;
        }
    }
    return false;
}

二 事件分发器 

1. 事件分发函数原型:[override virtual protected] bool QWidget::event(QEvent *event);

2. 使用步骤

第一步:在 Qt 项目中创建一个窗口类,继承标准的窗口类(QWidget 或其派生类)
第二步:在创建的窗口类中重写事件分发器函数

3. 代码示例:

//重写事件分发函数,过滤掉窗口的鼠标单击和双击事件

1. QWidget 头文件:
	
	//重写事件分发器函数
    bool event(QEvent *event);

2. QWidget 源文件:

//重写事件分发器函数
bool Widget::event(QEvent *event)
{
    //检测到鼠标单击和双击事件
    if(event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick)
    {
        QMessageBox::information(nullptr, "提示", "检测到鼠标单击和双击事件!", QMessageBox::Ok);

        //在本窗口中过滤掉鼠标按下事件
        //返回 true:Qt 认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。
        //返回 false:Qt 认为这个事件未被处理,会将这个事件传递到父窗口
        return true;
    }
    return QWidget::event(event);
}

三 事件处理器

1. API

鼠标事件处理器函数

1. 鼠标按下事件

当鼠标左键、鼠标右键、鼠标中键被按下时,该函数被自动调用,通过参数可以得到当前按下的是哪个鼠标键

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


2. 鼠标释放事件

当鼠标左键、鼠标右键、鼠标中键被释放,该函数被自动调用,通过参数可以得到当前释放的是哪个鼠标键

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


3. 鼠标移动事件

当鼠标移动(也可以按住一个或多个鼠标键移动),该函数被自动调用,通过参数可以得到在移动过程中哪些鼠标键被按下了。

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


4. 鼠标双击事件

当鼠标双击该函数被调用,通过参数可以得到是通过哪个鼠标键进行了双击操作。

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


5. 鼠标进入事件

当鼠标进入窗口的一瞬间,触发该事件,注意:只在进入的瞬间触发一次该事件

[virtual protected] void QWidget::enterEvent(QEvent *event);


6. 鼠标离开事件

当鼠标离开窗口的一瞬间,触发该事件,注意:只在离开的瞬间触发一次该事件

[virtual protected] void QWidget::leaveEvent(QEvent *event);


键盘事件处理器函数


1. 键盘按下事件

当键盘上的按键被按下了,该函数被自动调用,通过参数可以得知按下的是哪个键。

[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event);


2. 键盘释放事件

当键盘上的按键被释放了,该函数被自动调用,通过参数可以得知释放的是哪个键。

[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event);


3. 通过事件获取键盘按键值:
    QChar(event->key()); 


窗口事件处理器函数


1. 窗口重绘事件

[virtual protected] void QWidget::paintEvent(QPaintEvent *event);

补充:手动触发绘图事件处理器函数的方法

 1.1 执行 update();
 说明:调用该函数后,不会立即重绘,而是将重绘请求添加到事件队列中,在适当的时机调用 paintEvent() 函数进行重绘操作。多次连续调用 update() 可能只会导致一次 paintEvent() 调用,因为 Qt 会自动合并相邻的更新请求。

 1.2 repaint();
 说明:调用该函数后会立即调用 paintEvent() 函数进行重绘操作。


2. 窗口关闭事件

[virtual protected] void QWidget::closeEvent(QCloseEvent *event);


3. 重置窗口大小事件

[virtual protected] void QWidget::resizeEvent(QResizeEvent *event);

拖放事件处理器函数

1. 当一个拖放操作进入一个可以接收拖放事件的窗口小部件时触发
virtual void dragEnterEvent(QDragEnterEvent *event);

2. 当一个拖放操作在可接收拖放事件的窗口小部件内移动时触发
virtual void dragMoveEvent(QDragMoveEvent *event);

3. 当一个拖放操作离开一个可接收拖放事件的窗口小部件时触发
virtual void dragLeaveEvent(QDragLeaveEvent *event);

4. 当一个拖放操作最终在窗口小部件上释放鼠标按钮时触发,代表拖放操作完成
virtual void dropEvent(QDropEvent *event);

自定义事件处理器函数


1.QObject 专门处理自定义事件的函数,自定义事件都会被分配到这里处理。
void QObject::customEvent(QEvent *event);

2. 使用步骤 

第一步 在 Qt 项目中创建一个窗口类,继承标准的窗口类(QWidget 或其派生类)

第二步 在创建的窗口类中重写事件处理器函数

3. 举例:自定义控件(根据鼠标的不同事件,自定义控件显示不同的状态)

完整代码在绑定的资源中,审核通过后可下载。
 

 

标签:窗口,Qt,函数,事件,QWidget,过滤器,event,鼠标
From: https://blog.csdn.net/qq_36318563/article/details/140403143

相关文章

  • MQTT是什么,物联网
    写文思路:以下从几个方面介绍MQTT,包括:MQTT是什么,MQTT和webSocket的结合,以及使用场景,一、MQTT是什么MQTT(MessageQueuingTelemetryTransport)是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)设备之间的通信。MQTT在设计时考虑了低带宽、不可靠网络环境下的高效......
  • PyQt5学习之路一:python与QT搭配,实现UI设计与业务逻辑层分离
    一、Python安装1.下载Pythonpython官网链接如下:链接:https://www.python.org/根据图中提示选择需要的python版本,下载并安装二、QT安装1.下载QTQt官网链接如下:链接:https://www.qt.io/下载社区版QT就可以三、PyQt5的安装1.PyQt5简介python语言最为排行第一的......
  • 【Qt Designer用Frame设置背景图片】不影响其它组件小技巧,控件层级设置,组件的继承
    QtDesigner用Frame设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承在设置背景时,遇到一个问题,例如用frame当最后一层设置背景,加载资源图片后,会使frame内部组件继承相同格式,很麻烦。原语句用法border-image:url(:/images/login.png);内部组件会出现父......
  • 【PyQt5连接Mysql】python连接成功记录(版本对应)-最新
    在做一个qt登陆注册界面时,不得不使用数据库的连接,但是一直连接失败,记录一下个人成功解决的方法,希望能帮到各位。我的版本为Qt5VersionNumberis:5.15.2,PyQt5Versionis:5.15.10,Mysql8.0。参考:①PyCharm+PyQt5(5.15.2)+mysql,PyQt5连接mysql,踩坑与解决办法②PyQt5连......
  • 拯救中国足球,要不尝试一下DDD事件风暴?
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集张逸老师写了新文章《领域建模的常见问题及解决方案》,我来谈一谈对这篇文章的感想。(1)文章一开始,张逸老师大大地赞扬了事件风暴:图1摘自《领域建模的常见问题及解决方案》张逸老师......
  • QT工程构建目录下,将生成的中间文件和可执行文件分离
    在QT工程中,当我们选择了构建目录后,编译生成程序后,总会发现在debug目录下会有混淆着各类文件,如下图很多时候,我们又仅仅只需要可执行文件或者自定义的动态链接库。如下图 当然,如果不觉得麻烦,有人会选择手动删除。但是这并不是最佳解决方案,因为还有更简单的只需要在.pro......
  • Qt pro 文件中路径设置 生成可执行文件路径等
    Qtpro文件中路径设置生成可执行文件路径恋恋西风已于2023-06-2923:22:50修改阅读量3.2k 收藏19点赞数1分类专栏:QT文章标签:qt开发语言版权QT专栏收录该内容61篇文章16订阅订阅专栏   工程文件.pro描述了工程信息。工程文件信息会被qmake用于生......
  • 嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)
    1.项目概述本项目旨在开发一套先进的智能工厂设备监控系统,集成嵌入式技术、工业通信协议和人机界面等多项技术,实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率,大幅降低维护成本,并为管理层决策提供可靠的数据支持。主要功......
  • QT6 CMake项目配置 (VSCode)
    QT6CMake项目配置(VSCode)这篇文章我们介绍一下在VSCode下的配置,大体上和VisualStudio上差不多,建议先把之前介绍在VS上的配置过程看一遍,VSCode安装这个就不用说了吧,无脑下一步插件安装先把CMake相关的插件装一下第一个是CMake语言的支持插件,装了这个写CMakeLists.txt就......
  • Windows 下安装 Qt 教程
    1.下载安装包进入官网,会出现以下内容:其分别代表着:Name注释snapshots预览版,最新测试中的Qt库和开发工具onlineQt在线安装源official_releases正式发布版,相对稳定的Qt库和开发工具ministro迷你版,针对Android的版本learningQt的文档和示范视......