Qt事件传递顺序是怎样的?

1、事件传递顺序规则

在Qt中,事件传递的顺序事件首先传递到目标对象的事件过滤器,然后传递到事件处理函数,最后传递到父对象的事件过滤器事件处理函数

为了更好地理解这一过程,下面将通过一个示例来展示事件在父窗口和子窗口之间的传递顺序。

2、示例:父子窗口的事件传递

2.1 项目结构

myproject/
├── main.cpp
├── parentwidget.h
├── parentwidget.cpp
├── childwidget.h
└── childwidget.cpp

2.2 main.cpp

#include <QApplication>
#include "parentwidget.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);ParentWidget parentWidget;parentWidget.setGeometry(100, 100, 400, 400);parentWidget.setStyleSheet("background-color: lightblue;");parentWidget.show();return app.exec();
}

2.3 parentwidget.h

#ifndef PARENTWIDGET_H
#define PARENTWIDGET_H#include <QWidget>
#include "childwidget.h"class ParentWidget : public QWidget {Q_OBJECT
public:ParentWidget();protected:bool eventFilter(QObject *obj, QEvent *event) override;void mousePressEvent(QMouseEvent *event) override;private:ChildWidget *childWidget;
};#endif // PARENTWIDGET_H

2.4 parentwidget.cpp

#include "parentwidget.h"
#include <QDebug>
#include <QEvent>ParentWidget::ParentWidget() {childWidget = new ChildWidget(this);childWidget->setGeometry(50, 50, 200, 200);childWidget->setStyleSheet("background-color: yellow;");// Only install event filter on itself, not on the child widgetthis->installEventFilter(this);
}bool ParentWidget::eventFilter(QObject *obj, QEvent *event) {if (event->type() == QEvent::MouseButtonPress) {if (obj == this) {qDebug() << "Mouse button press event filtered in ParentWidget";}}return QWidget::eventFilter(obj, event);
}void ParentWidget::mousePressEvent(QMouseEvent *event) {qDebug() << "Mouse press event in ParentWidget";QWidget::mousePressEvent(event);
}

2.5 childwidget.h

#ifndef CHILDWIDGET_H
#define CHILDWIDGET_H#include <QWidget>class ChildWidget : public QWidget {Q_OBJECT
public:ChildWidget(QWidget *parent = nullptr);protected:bool eventFilter(QObject *obj, QEvent *event) override;void mousePressEvent(QMouseEvent *event) override;
};#endif // CHILDWIDGET_H

2.6 childwidget.cpp

#include "childwidget.h"
#include <QDebug>
#include <QEvent>ChildWidget::ChildWidget(QWidget *parent) : QWidget(parent) {// Install event filter on itselfthis->installEventFilter(this);
}bool ChildWidget::eventFilter(QObject *obj, QEvent *event) {if (event->type() == QEvent::MouseButtonPress) {if (obj == this) {qDebug() << "Mouse button press event filtered in ChildWidget";}}return QWidget::eventFilter(obj, event);
}void ChildWidget::mousePressEvent(QMouseEvent *event) {qDebug() << "Mouse press event in ChildWidget";QWidget::mousePressEvent(event);
}

3、示例解释和运行结果

3.1 点击 ChildWidget

  1. ChildWidget 的事件过滤器首先捕捉到事件并打印 Mouse button press event filtered in ChildWidget
  2. 然后,ChildWidgetmousePressEvent 捕捉到事件并打印 Mouse press event in ChildWidget
  3. 最后,如果事件未被完全处理,传递到父窗口 ParentWidget 的事件过滤器,并打印 Mouse button press event filtered in ParentWidget from ChildWidget
  4. 然后,ParentWidgetmousePressEvent 捕捉到事件并打印 Mouse press event in ParentWidget

3.2 点击 ParentWidget

  1. ParentWidget 的事件过滤器首先捕捉到事件并打印 Mouse button press event filtered in ParentWidget
  2. 然后,ParentWidgetmousePressEvent 捕捉到事件并打印 Mouse press event in ParentWidget

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

`lupdate`、`linguist` 和 `lrelease` 是 Qt 中处理翻译的三个关键工具

lupdate、linguist 和 lrelease 是 Qt 中处理翻译的三个关键工具 lupdate、linguist 和 lrelease 是 Qt 中处理翻译的三个关键工具。以下是这些工具的具体使用方法及其流程: 1. lupdate lupdate 工具用于从源代码中提取翻译字符串并生成 .ts 文件。这个文件包含应用程序中的…

IOS Swift 从入门到精通:@escaping 和PreferenceKey

@escaping 在Swift中,@escaping是一个属性关键字,用于标记闭包参数。当一个闭包在函数返回之后才被调用时,这个闭包被称为逃逸闭包(Escaping Closure)。使用@escaping关键字可以告诉Swift编译器,传递给函数的闭包可能会在函数执行完毕后被调用,因此它需要“逃逸”函数的…

投票多功能小程序(ThinkPHP+Uniapp+FastAdmin)

&#x1f389;你的决策小助手&#xff01; 支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c;Uniapp提供全部无加密源码。​ 一、引言&#xff1a;为什么我们需要多功能投票小程序&#…

小程序的基本使用

【 0 】前言 【 0 】 这个就是js代码的存放地方 app.json // pages/banner/banner.js Page({/*** 页面的初始数据*/data: {},/*** 生命周期函数--监听页面加载*/onLoad(options) {},/*** 生命周期函数--监听页面初次渲染完成*/onReady() {},/*** 生命周期函数--监听页面显示…

【安卓13 源码】RescueParty救援机制

RescueParty机制正是在这个背景下诞生的&#xff0c;当它注意到系统或系统核心组件陷入循环崩溃状态时&#xff0c;就会根据崩溃的程度执行不同的救援行动&#xff0c;以期望让设备恢复到正常使用的状态。 开机后会自动重启&#xff0c;进入Recovery界面。经查找&#xff0c;是…

代码随想录-Day39

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

compare to 和 compare with 有什么区别?

“Compare to” 和 “compare with” 在使用上有些微小的区别。 Compare to 用于描述两个或多个不同种类的事物之间的类似之处&#xff0c;强调相似性和类比。例如&#xff1a;“她的声音像一阵清风&#xff0c;比作一把小提琴。” Compare with 则用于对比两个或多个同类事物…

COD论文笔记 TCSVT_2024 Finding_Camouflaged_Objects_Along_the_Camouflage_Mechanisms

动机 论文的动机是重新审视伪装物体检测&#xff08;COD&#xff09;任务&#xff0c;并从伪装机制的角度提出一种新的解码伪装的方法。传统的COD方法难以准确区分伪装物体和背景&#xff0c;因此作者提出通过借助显著物体检测&#xff08;SOD&#xff09;任务来实现解码伪装&…

线程安全问题(一)——锁的简单使用

多线程安全问题 线程安全问题的引入案例引入多线程指令排序问题 线程不安全的原因解决线程不安全的方法锁的引入上锁和解锁过程一个简单的锁Demo对这个案例进行几次修改 总结 线程安全问题的引入 在前面的博文中&#xff0c;我们了解到通过Thread.join()的方法让线程进入等待&…

RIPv1 和 RIPv2 区别

RIP (Routing Information Protocol&#xff0c;路由信息协议&#xff09; RIP 是一个比较早期的协议&#xff0c;在实际部署中较少使用&#xff0c;但 RIP 协议的机制是所有矢量跻由协议的基础&#xff0c;因此&#xff0c;掌握 RIP 协议的工作原理对研究矢量路由协议有重要的…

统信UOS系统忘记登录密码怎么办

在使用统信操作系统UOS的时候有可能会出现忘记密码的情况&#xff0c;当遇到了用户登录密码忘记时如何修改&#xff1f;今天分享一下忘记超级系统管理员Root以及普通密码时的解决方法。 因为UOS系统版本的原因&#xff0c;UOS 1031操作系统取消了单用户更改密码的方法&#xff…

jupyter notebook的markdown语法不起作用

在这个界面编辑&#xff0c;发现markdown你编辑的是什么就是什么&#xff0c;不起作用&#xff0c;然而点一下&#xff1a; 右上角“Notebook转发”&#xff0c;就会单独跳出一个jupyter notebook的界面&#xff0c;此时就会奏效&#xff1a;

如何把一个JAVA项目设置有效期,授权日期的方法

创建一个 config.properties expirationDateQJICbwa/nzypraK6MYp62LUC/fambI7G这个是QJICbwa/nzypraK6MYp62LUC/fambI7G加密后的日期&#xff08;这里指2024-12-31&#xff09; 然后在创建一个 LicenseManager import java.io.IOException; import java.io.InputStream; impo…

PostgreSQL与MySQL的区别探究

PostgreSQL 和 MySQL 是两种最受欢迎的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;。它们在功能、性能、扩展性、安全性等方面都有显著的差异。以下是 PostgreSQL 和 MySQL 的一些关键区别&#xff1a; 1. 体系结构和设计理念 PostgreSQL 设计理念&#xff1a;Po…

27-29、redis优化(令牌主动失效机制)-controllert额外添加参数接收请求头、拦截器

1、SpringBoot集成redis <!--redis坐标--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> @SpringBootTest//如果在测试类上添加了这个注解,那么…

【CT】LeetCode手撕—72. 编辑距离

目录 题目1- 思路动规五部曲 2- 实现⭐72. 编辑距离——题解思路 3- ACM 实现 题目 原题连接&#xff1a;72. 编辑距离 1- 思路 模式识别&#xff1a;编辑举例 ——> 动态规划 动规五部曲 1.dp数组的含义 int[][] dp new int[word1.length()][word2.length()];以 i-1 …

windchill 相关配置

-Dhttp.proxyHostproxy.acme.com -Dhttp.proxyPort8080 -Dwt.rmi.clientSocketFactorywt.boot.WTRMIMasterSocketFactory -Dwt.rmi.javarmicgiservlet/JavaRMIServlet

6-47选择整数计算

整数计算&#xff1a; 用swing组件来实现整数计算&#xff0c;需要对整数计算的值进行校验。 import javax.swing.*; import java.awt.*; import java.awt.event.*;public class IntegerCalculator extends JFrame implements ActionListener {private JCheckBox[] checkBoxe…

【分布式文件系统HDFS】文件操作基本命令的使用

目录 一、按照下述要求写出相应的文件操作命令&#xff0c;执行并观察结果 1. 新建目录 1.1 在本地文件系统按要求创建如下的文件夹 1.2 在HDFS文件系统按要求创建如下的文件夹 2. 编辑文件test1.txt&#xff0c;放入本地文件夹 /opt/user/myfile 3. 使用moveFromLocal命令…

本地部署大模型的简单方法

https://ollama.com/https://ollama.com/ 在本地安装ollama windows版本。安装好后&#xff0c;就可以验证大模型了。 可以先测试一下qwen 0.5b&#xff0c;打开cmd&#xff0c;执行ollama run qwen:0.5b&#xff0c;首次会下载大模型的模型资源。 模型下好后就可以交互…