Qt事件处理机制3-事件函数的分发

Qt开发中,经常重写event函数和具体的事件处理函数,例如mousePressEvent、paintEvent等,那么这些具体的事件处理函数是怎样被调用的呢?答案是由继承自QObject的类中的event函数来处理事件分发。这里以间接继承自QWidget的派生类MyButton举例说明。

MyButton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H#include <QPushButton>class MyButton : public QPushButton
{Q_OBJECT
public:MyButton(QWidget *parent = nullptr);~MyButton();protected:bool event(QEvent *e) override;void mousePressEvent(QMouseEvent *event) override;
};#endif // MYBUTTON_H

MyButton.cpp

#include "MyButton.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{}MyButton::~MyButton()
{}bool MyButton::event(QEvent *e)
{if (e->type() == QEvent::MouseButtonPress){qDebug() << __FUNCTION__ << e->isAccepted();}return QPushButton::event(e);
}void MyButton::mousePressEvent(QMouseEvent *event)
{qDebug() << __FUNCTION__ << event->isAccepted();
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:bool event(QEvent *e) override;void mousePressEvent(QMouseEvent *event) override;private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::event(QEvent *e)
{if (e->type() == QEvent::MouseButtonPress){qDebug() << __FUNCTION__ << e->isAccepted();}return QMainWindow::event(e);
}void MainWindow::mousePressEvent(QMouseEvent *event)
{qDebug() << __FUNCTION__ << event->isAccepted();
}

运行结果正常

MyButton::event true
MyButton::mousePressEvent true// 若如下修改MyButton::mousePressEvent函数
void MyButton::mousePressEvent(QMouseEvent *event)
{qDebug() << __FUNCTION__ << event->isAccepted();event->ignore();
}
那么运行结果为(该代码同时验证了上一篇文章所说的事件函数的传播):
MyButton::event true
MyButton::mousePressEvent true
MainWindow::event true
MainWindow::mousePressEvent true

可以看到,QPushButton::event(e)函数里最终调用了具体事件处理函数mousePressEvent,该函数是在QWidget类的event函数中进行分发的(MyButton->QPushButton->QAbstractButton->QWidget层层调用event函数)。

补充:QWidget中,event函数主要负责事件分发

bool QWidget::event(QEvent *event)
{Q_D(QWidget);// ignore mouse and key events when disabledif (!isEnabled()) {switch(event->type()) {case QEvent::TabletPress:case QEvent::TabletRelease:case QEvent::TabletMove:case QEvent::MouseButtonPress:case QEvent::MouseButtonRelease:case QEvent::MouseButtonDblClick:case QEvent::MouseMove:case QEvent::TouchBegin:case QEvent::TouchUpdate:case QEvent::TouchEnd:case QEvent::TouchCancel:case QEvent::ContextMenu:case QEvent::KeyPress:case QEvent::KeyRelease:
#if QT_CONFIG(wheelevent)case QEvent::Wheel:
#endifreturn false;default:break;}}switch (event->type()) {case QEvent::MouseMove:mouseMoveEvent((QMouseEvent*)event);break;case QEvent::MouseButtonPress:mousePressEvent((QMouseEvent*)event);break;case QEvent::MouseButtonRelease:mouseReleaseEvent((QMouseEvent*)event);break;case QEvent::MouseButtonDblClick:mouseDoubleClickEvent((QMouseEvent*)event);break;...default:return QObject::event(event);}return true;
}

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

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

相关文章

风控迁徙率报表逻辑和开发(Python)

出品人&#xff1a;东哥起飞 原创&#xff1a;&#x1f449;原创大数据风控课程《100天风控专家》 一、迁徙率介绍 什么是迁徙率呢&#xff1f; 我们说&#xff0c;一个账户现在处于某一逾期状态&#xff08;比如M1&#xff09;&#xff0c;一个月后&#xff0c;这个账户要么…

vscode只修改几行,git却显示整个文件都被修改

原因&#xff1a;不同的操作系统默认的回车换行符是不一样的&#xff0c;有些编辑器会自动修改回车换行&#xff0c;然后就整个文件都变化了。 Unix/Linux/Mac使用的是LF&#xff0c;但Windows一直使用CRLF【回车(CR, ASCII 13, r) 换行(LF, ASCII 10, n)】作为换行符。 解决&a…

Zookeeper(从入门到掌握)看完这一篇就够了

文章目录 一、初识 Zookeeper1.Zookeeper 概念2.Zookeeper 数据模型3.Zookeeper 服务端常用命令4.Zookeeper 客户端常用命令 二、ZooKeeper JavaAPI 操作1.Curator 介绍1.Curator API 常用操作&#xff08;1&#xff09;建立连接&#xff08;2&#xff09;添加节点&#xff08;…

电脑重启后word文档空白或打不开,word无法自动修复,如何拯救

最近编辑word文档&#xff0c;写了好几个星期的内容随着电脑重启的一瞬间&#xff0c;灰飞烟灭&#xff0c;让我简直痛不欲生&#xff01; 好在&#xff0c;天无绝人之路&#xff0c;以下两个方法拯救了地球 第一&#xff0c;普通的文档word自动修复不好使的时候&#xff0c;…

Git常用命令rebase(图文详解,彻底理解)

Git常用命令rebase&#xff08;图文详解&#xff0c;彻底理解&#xff09; 先看一个实际场景git rebase 过程中如何解决冲突git rebase 的优缺点 先看一个实际场景 首先构造两个分支 master 和 feature分支&#xff0c;其中 feature 分支是基于 master 分支拉的新分支&#xf…

使用 Docker 部署 instantbox 轻量级 Linux 系统

1&#xff09;instantbox 介绍 GitHub&#xff1a;https://github.com/instantbox/instantbox instantbox 是一款非常实用的项目&#xff0c;它能够让你在几秒内启动一个主流的 Linux 系统&#xff0c;随起随用&#xff0c;支持 Ubuntu&#xff0c;CentOS&#xff0c; Arch Li…

RocketMQ 06 消息存储机制

RocketMQ 06 消息存储机制 消息存储 image-20200228140910086.png 磁盘存储速度问题 省去DB层提高性能 RocketMQ 使用文件系统持久化消息。性能要比使用DB产品要高。 M.2 NVME协议磁盘存储 文件写入速度 顺序读写&#xff1a;3G左右 随机读写2G 数据零拷贝技术 很多使…

css面试题之flex实现麻将三饼布局

麻将应该很多人都熟悉吧&#xff0c;那如何通过flex布局尽可能使用少的节点来实现“三饼&#xff08;也有人管它叫桶&#xff09;”的效果呢&#xff1f;&#xff08;ps:麻将牌效果如下&#xff09; 实现步骤&#xff1a; 1.首先先通过flex修饰外层容器&#xff0c;内部的三个…

高风险IP的来源及其影响

随着互联网的发展&#xff0c;网络安全问题越来越引人关注。其中&#xff0c;高风险IP的来源成为了研究和讨论的焦点之一。高风险IP指的是那些经常涉及到网络攻击、恶意软件传播以及其他不良行为的IP地址。它们的存在不仅对个人和组织的网络安全构成威胁&#xff0c;还可能给整…

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-BiTCN-BiGRU-Attention向量加权算法优化双向时间卷积…

hive: 自定义函数的用法

一、依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

企业中台技术架构解决方案(中台建设指南Word原件2024)

通过中台建设实现企业能力复用&#xff0c;包括能力整合、业务创新、业务和数据闭环、组织模式演进等。 数字能力整合 企业的数字能力一般包括数字化营销、数字化产品、数字化供应链、数字化生产、数字化运营等。企业的数字化能力的充分利用&#xff0c;从而达到可持续发展。数…

爬虫 | 垃圾处理设施数据的获取与保存

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目通过发送网络请求&#xff08;requests&#xff09;&#xff0c;从指定的 URL 获取垃圾处理设施的相关数据&#xff0c;并将数据保存到 CSV 文件中&#xff0c;以供后续分析和利用。 目录 一、项目结构 二、详细说明 三…

面试官:请实现一个接口错误重试功能

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 什么是接口错误重试&#xff1f; 明确关键点 接口重试功能的实现 A…

防御式编程

前言 编写高质量代码有什么用&#xff1f; 作为一名程序猿&#xff0c;或软件开发工程师&#xff0c;或技术工人&#xff0c;首要任务就是编写好代码(编写高质量代码)。那么编写好代码有什么用呢&#xff1f;靠编写好代码可以维持你的工作&#xff08;基础&#xff09;&#…

有点意思!腾讯 ARC Lab 最新发布的MiraData数据集,用于长视频生成,从这些方面做了clip分层描述……

最近小编网上冲浪时&#xff0c;被腾讯 PCG ARC Lab 新开源的文本-视频数据集——MiraData 吸引了目光。 这个数据集有多新&#xff1f;Readme在一天前刚更新完的那种&#xff0c;而且数据集有一大特点&#xff0c;是专门为长视频生成任务设计的大规模视频数据集&#xff0c;不…

2024年生物医学与食品安全国际会议 (ICBFS 2024)

2024年生物医学与食品安全国际会议 (ICBFS 2024) 2024 International Conference on Environmental Prevention and New Materials 【会议简介】 2024年生物医学与食品安全国际会议即将在成都召开。本次会议将汇聚全球生物医学与食品安全领域的专家学者&#xff0c;共同探讨生…

【JavaSE进阶】05-集合

集合继承结构图 集合继承结构图_Collection部分 注&#xff1a;泛化关系即继承关系&#xff0c;is a&#xff1b;关联关系&#xff0c;has a&#xff1b;实现关系&#xff0c;like a 1 接口java.util.Collection<E>: 接口Collection是集合中的超级父接口 Iterator it…

英特尔推出中国特供版Gaudi 3芯片,性能暴降92%以应对美国出口管制|TodayAI

英特尔近期发布消息&#xff0c;其将在中国市场推出专为该地区定制的“特供版”Gaudi 3 AI芯片&#xff0c;以符合美国对AI芯片的出口管制。这一版本包括HL-328型号的OAM兼容夹层卡&#xff0c;预计将于6月24日发布&#xff1b;以及HL-388型号的PCIe加速卡&#xff0c;计划在9月…

网络编程文件传输小练习

客户端 public class client {public static void main(String[] args) {try {//创建一个客户端的发送对象,指定一个端口号Socket socketnew Socket("127.0.0.1",10000);//读取本地文件的数据//将本地文件读到输入流中//bis是输入流,将本地文件读入流中,bos是输出流…