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

news2024/11/24 14:58:37

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 widget
    this->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 itself
    this->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.coloradmin.cn/o/1877514.html

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

相关文章

盘点全球Top10大云计算平台最热门技能证书

小李哥花了一年半时间终于考下全球10大云的77张认证&#xff0c;今天盘点下各个云的热门证书&#xff0c;希望能帮到非CS专业转IT和刚刚入行云计算的小伙伴。 排名取自23年Yahoo云计算市场份额排名报告&#xff0c;我会从云平台、证书价格、证书热门程度做推荐。 1️⃣亚马逊云…

微机原理 复习

第一章导论 1.3 冯诺依曼体系结构 &#xff08;1&#xff09;以二进制形式表示指令和数据 &#xff08;2&#xff09;程序和数据事先放在存储器中&#xff08;预存储&#xff09; &#xff08;3&#xff09;由运算器、控制器、输入设备和输出设备五大部件组成 字长、主频…

《昇思25天学习打卡营第6天|onereal》

Vision Transformer&#xff08;ViT&#xff09;简介 近些年&#xff0c;随着基于自注意&#xff08;Self-Attention&#xff09;结构的模型的发展&#xff0c;特别是Transformer模型的提出&#xff0c;极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩…

深度解析:机器学习如何助力GPT-5实现语言理解的飞跃

文章目录 文章前言机器学习在GPT-5中的具体应用模型训练与优化机器翻译与跨语言交流&#xff1a;情感分析与问答系统&#xff1a;集成机器学习功能&#xff1a;文本生成语言理解任务适应 机器学习对GPT-5性能的影响存在的挑战及解决方案技术细节与示例 文章前言 GPT-5是OpenAI公…

昇思25天学习打卡营第11天|SSD目标检测

1. 学习内容复盘 模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)…

任意密码重置漏洞

文章目录 1. 任意密码重置漏洞原理2. 任意密码重置漏洞产生原因3. 任意密码重置漏洞场景3.1 验证码爆破3.2 验证凭证回传3.3 验证凭证未绑是用户3.4 跳过验证步骤3.5 凭证可预测3.6 同时向多个账户发送凭证 4. 任意密码重置经典案例4.1 中国人寿某重要系统任意账户密码重置4.2 …

Go Error 处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ModuleNotFoundError: No module named ‘_sysconfigdata_x86_64_conda_linux_gnu‘

ModuleNotFoundError: No module named _sysconfigdata_x86_64_conda_linux_gnu 1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;4.结果预览&#x1f914; 1.软件环境⚙️ Ubuntu 20.04 Python 3.7.0 2.问题描述&#x1f50d; 今天发现更新conda之后&#xff0…

【数据库】Oracle安装报错(win10安装oracle提示环境不满足最低要求)

目录 一、问题场景&#xff1a; 二、问题描述 三、原因分析&#xff1a; 四、解决方案&#xff1a; 一、问题场景&#xff1a; 安装Oracle数据库 二、问题描述 安装之前提示&#xff08; [INS-13001]环境不满足最低要求。 是否确实要继续? &#xff09; 如图所示&…

1-爬虫基础知识(6节课学会爬虫)

1-爬虫基础知识&#xff08;6节课学会爬虫&#xff09; 1.什么是爬虫2.爬取的数据去哪了3.需要的软件和环境4.浏览器的请求&#xff08;1&#xff09;Url&#xff08;2&#xff09;浏览器请求url地址&#xff08;3&#xff09;url地址对应的响应 5.认识HTTP/HTTPS5.1 http协议之…

43.三倍游戏

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/390 题目描述 三倍游戏是一种单人游戏。玩…

2.优化算法之滑动窗口1

1.长度最小的子数组 . - 力扣&#xff08;LeetCode&#xff09; &#xff08;1&#xff09;题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;…

全网唯一免费无水印AI视频工具!

最近Morph Studio开始免费公测&#xff01;支持高清画质&#xff0c;可以上传语音&#xff0c;同步口型&#xff0c;最重要的是生成的视频没有水印&#xff01; Morph Studio国内就可以访问&#xff0c;可以使用国内邮箱注册&#xff08;我用的163邮箱&#xff09;&#xff0c;…

Java代码高风险弱点与修复之——弱密码哈希漏洞-Very weak password hashing (WEAK_PASSWORD_HASH)

弱密码哈希漏洞 弱密码哈希漏洞指的是在密码存储和验证过程中,由于使用了不安全的哈希算法或哈希函数的错误使用,导致攻击者能够更容易地破解或绕过密码验证机制。这种漏洞使得存储在系统或应用中的用户密码容易受到威胁,增加了账户被非法访问和数据泄露的风险。 常见的弱…

前端工程化08-新的包管理工具pnpm

1、历史原因解读 pnpm这个东西发布的时间是比较早的&#xff0c;但是在最近一两年的时候才开始流行&#xff0c;甚至是可以说非常的盛行&#xff0c;那么这个包到底是个什么东西的&#xff0c;那么我们先说下&#xff0c;原来的包管理工具到底有那些问题&#xff1f;比如说我们…

面向对象和面向过程编程的区别

引言 小伙伴们&#xff0c;当你们看到这章的时候&#xff0c;显然你们已经跨过了来自指针给你们带来的麻烦&#xff0c;唔~真棒呢&#xff0c;但是我们只学会一些基础的C语法并不能帮我们解决问题&#xff0c;甚至是稍微难一些的题目我们都没办法解决&#xff0c;那怎么办呢&am…

Linux基础 - BIND加密传输缓存服务器

目录 零. 简介 一. 安装 二. 安全的加密传输 三. 部署缓存服务器 四. 总结 零. 简介 BIND&#xff08;Berkeley Internet Name Domain&#xff09;是一款广泛使用的开源 DNS&#xff08;域名系统&#xff09;服务器软件。 域名系统的主要作用是将易于人类理解的域名&…

实验2 色彩模式转换

1. 实验目的 ①了解常用的色彩模式&#xff0c;理解色彩模式转换原理&#xff1b; ②掌握Photoshop中常用的颜色管理工具和色彩模式转换方法&#xff1b; ③掌握使用Matlab/PythonOpenCV编程实现色彩模式转换的方法。 2. 实验内容 ①使用Photoshop中的颜色管理工具&#xff…

Node.js个人博客

1. 项目介绍 项目演示地址&#xff1a;https://ximingx.org.cn/ 项目github&#xff1a;https://github.com/ximingx/blog 想象一下,你是一位热爱写作的程序员小王。每天,你都有很多新的想法和技术心得想要分享。但是,管理你的博客网站却成了一个让你头疼的问题。 周一早晨…

统计分析利器:深入解读卡方检验与单因素方差分析的应用案例【练习题】

一、卡方检验 1.对400人进行问卷调查&#xff0c;询问对于教学改革的看法&#xff0c;调查结果如下表所示&#xff0c;请问不同学科不同性别的人意见是否相同。 学科 男生 女生 工科 80 40 理科 120 160 &#xff08;性别&#xff0c;学科均无序分类>卡方检验&am…