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;
}
相关文章:
Qt事件处理机制3-事件函数的分发
Qt开发中,经常重写event函数和具体的事件处理函数,例如mousePressEvent、paintEvent等,那么这些具体的事件处理函数是怎样被调用的呢?答案是由继承自QObject的类中的event函数来处理事件分发。这里以间接继承自QWidget的派生类MyB…...
4月9号总结
java学习 一.steam流 1.介绍 Stream 是 Java 8 中引入的一种处理集合数据的新抽象。它提供了一种高效且便利的方式来处理集合中的元素,支持函数式编程的特性,使得集合操作变得更加简洁和灵活。 2.创建 List和Set可以直接调用接口的steam方法转换为流 …...
Linux生态系统:探索Linux的开源世界
Linux生态系统:探索Linux的开源世界 在前面的博客中,我们深入探讨了Linux的各种技能和技巧,从入门到进阶,再到高手级别。这一路走来,相信大家对Linux已经有了全面的认识和掌握。然而,Linux的魅力远不止于此。今天,我们将进一步探索Linux生态系统,了解Linux在开源世界中的重要地…...
XILINX 10G PCS PMA IP核使用
文章目录 一、设计框图二、模块设计三、IP核配置四、上板验证五、总结 一、设计框图 关于GT高速接口的设计一贯作风,万兆以太网同样如此,只不过这里将复位逻辑和时钟逻辑放到了同一个文件ten_gig_eth_pcs_pma_0_shared_clock_and_reset当中。如果是从第…...
Scrapy框架内存泄漏问题及解决
说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 一、问题背景及原因 官方文档:Debugging memory leaks — Scrapy 2.11.1 documentation Scrapy是一款功能强大的网络爬虫框…...
app 创建快捷入口 在手机上面多个icon
activity-alias详解及应用-CSDN博客 Android动态修改应用图标最佳实践 - 简书 AndroidManifest.xml 中 <activity-aliasandroid:name"包名.ui.mine.SecondActivityAlias"android:label"快捷入口"android:icon"mipmap/collection_one"andro…...
【网安小白成长之路】6.pkachu、sql-lbas、upload-lbas靶场搭建
🐮博主syst1m 带你 acquire knowledge! ✨博客首页——syst1m的博客💘 🔞 《网安小白成长之路(我要变成大佬😎!!)》真实小白学习历程,手把手带你一起从入门到入狱🚭 &…...
vue 项目中添加DES加密
vue 项目中添加DES加密 由于现在项目使用http协议,且登录界面是明文传输,项目真正上线后基本的密码传输都很不安全。 决定用前端框架加密后再进行传输,以提高密码传输过程中的安全性。 crypto-js 是一个流行的 JavaScript 加密库࿰…...
【记录问题】如何测试虚拟机已经可以连接网络
如何测试虚拟机已经可以连接网络 要测试虚拟机是否已经连接网络,可以采取以下步骤: 检查虚拟网络编辑器 使用管理员权限打开虚拟网络编辑器,检查NAT方式下的虚拟子网网段。 确保虚拟机的网络设置与虚拟子网网段相匹配。检查虚拟机网络设置 …...
MySQL数据库的详解(1)
DDL(数据库操作) 查询 查询所有数据库:show databases;当前数据库:select database(); 创建 创建数据库:create database [ if not exists] 数据库名 ; 使用 使用数据库:use 数据库名 ; 删除 删除数…...
Python 网络爬虫技巧分享:优化 Selenium 滚动加载网易新闻策略
简介 网络爬虫在数据采集和信息获取方面发挥着重要作用,而滚动加载则是许多网站常用的页面加载方式之一。针对网易新闻这样采用滚动加载的网站,如何优化爬虫策略以提高效率和准确性是一个关键问题。本文将分享如何利用 Python 中的 Selenium 库优化滚动…...
Apache SeaTunnel 社区 3 月月报
各位热爱 SeaTunnel 的小伙伴们,SeaTunnel 社区 3 月月报来啦!这里将记录 SeaTunnel 社区每个月的重要更新,并评选出月度之星,欢迎关注。 SeaTunnel 月度 Merge Stars 感谢以下小伙伴 3 月为 Apache SeaTunnel 做的精彩贡献&…...
ElasticSearch 的 ConstantScoreQuery 的理解
ConstantScoreQuery的定义: A query that wraps another query and simply returns a constant score equal to 1 for every document that matches the query. It therefore simply strips of all scores and always returns 1. 结合DisMaxQueryBuilder可以查找所…...
【RV1106的ISP使用记录之一】基础环境搭建
公司缺少ISP工程师,做为图像算法工程师的我这就不就给顶上来了么,也没给发两份工资,唉~ 先写个标题,占一个新坑,记录RK平台的传统ISP工作。 一、基础环境的硬件包括三部分: 1、相机环境,用于采…...
mars3d.MaterialType.Image2修改配置面状:图片2的speed数值实现动画效果说明
摘要: mars3d.MaterialType.Image2修改配置面状:图片2的speed数值实现动画效果说明 前提: 1.在示例中,尝试给mars3d.MaterialType.Image2材质的图片加上speed参数,实现动画效果,但是没有看到流动效果说明…...
Elasticsearch部署安装
环境准备 Anolis OS 8 Firewall关闭状态,端口自行处理 Elasticsearch:7.16.1(该版本需要jdk11) JDK:11.0.19 JDK # 解压 tar -zxvf jdk-11.0.19_linux-x64_bin.tar.gz# 编辑/etc/profile vim /etc/profile# 加入如下…...
Android零基础入门(一)配置环境和安装Android Studio
闲来无事学一下Android,本人目前java为主,jdk的环境就不赘述了 配置环境 Java JDK5 或 以后版本 Android SDK Java运行时环境(JRE) Android Studio 你可以从 Oracle 的 Java 网站:JDKJava SE下载下载最新版本的 Jav…...
Golang编译优化——消除Copy指令
一、优化概述 以下是Go编译器对某个代码段编译生成的SSA IR摘选,对于Golang SSA IR的介绍我写了文章,但是在犹豫要不要发。 b1:-... Plain → b2 (5)b2: ← b1 b4-v9 (5) Phi <int> v8 v16 (i[int])v22 (8) Phi <int> v7 v14 (r[int])v1…...
Java IO流对象流实操
ATM的io对象流: package com.jsu.atm; import com.jsu.atm.Serializable; public class Account implements Serializable{//私有数据成员private String UserName; // 用户名称private String PassWord; // 用户密码private double RemainMoney; // 用户余额…...
Mapbox教程:一个简单Demo
近期工作中准备把Mapbox用起来,准备发几个教程,把Mapbox再熟悉熟悉。工作中也用过不少的Web GIS组件,在这里说一下我对这些WebGIS组件的印象。 Leaflet 代码简洁,插件丰富,相比于其大小,功能也挺强大&#…...
抖音无水印视频下载神器:3分钟快速上手,轻松保存高清无水印视频
抖音无水印视频下载神器:3分钟快速上手,轻松保存高清无水印视频 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载:https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downlo…...
基础教程通过Taotoken CLI一键配置开发环境与API密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 基础教程:通过Taotoken CLI一键配置开发环境与API密钥 对于开发团队而言,让新成员快速、统一地接入大模型服…...
AI智能体配置管理:从环境变量到结构化配置的工程实践
1. 项目概述:一个为AI智能体量身定制的配置管理中枢最近在折腾AI智能体(Agent)相关的项目,无论是基于LangChain、AutoGPT还是其他框架,一个绕不开的痛点就是配置管理。API密钥、模型参数、工具配置、环境变量……这些零…...
数据库角色管理(Role Management)
1.1、角色基础角色是权限的集合,是 Oracle 权限管理的核心机制。12c 增强了角色的安全特性。创建角色:CREATE ROLE app_developer;创建带密码的角色(需激活时提供密码):CREATE ROLE sensitive_role IDENTIFIED BY &quo…...
别再熬大夜改论文了!okbiye AI 写作,把毕业论文从选题到终稿焊在及格线以上
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 打开电脑,对着空白的 Word 文档发呆,开题报告和初稿大纲改了又改,导师的红批注比正文还长,格…...
MacBook远程控制Win10打游戏?聊聊Microsoft Remote Desktop的那些隐藏玩法和限制
MacBook远程控制Win10打游戏?Microsoft Remote Desktop的极限性能测试与实战技巧 当MacBook用户需要临时调用Windows电脑的资源时,远程桌面工具往往成为救急首选。但你是否想过,这类工具能否胜任游戏、视频剪辑甚至3D建模等高图形负载任务&am…...
基于Claude的代码库感知工具:智能编程助手的设计与实战
1. 项目概述:当Claude遇上代码库,一个智能编程助手的诞生最近在GitHub上看到一个挺有意思的项目,叫openclaw-claude-code。光看名字,你可能会觉得这又是一个基于某个大语言模型的代码生成工具,但实际深入了解后&#x…...
终极指南:5分钟掌握Illustrator批量替换神器ReplaceItems.jsx,效率提升20倍
终极指南:5分钟掌握Illustrator批量替换神器ReplaceItems.jsx,效率提升20倍 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你正在寻找能够大幅提升Adob…...
Arm DSTREAM调试接口设计与JTAG/SWD协议详解
1. Arm DSTREAM系统与调试接口设计指南1.1 调试接口技术基础1.1.1 JTAG协议架构解析JTAG(Joint Test Action Group)标准IEEE 1149.1定义了五线制调试接口:TCK:测试时钟,同步所有JTAG操作TMS:测试模式选择&a…...
KafClaw:Apache Kafka增强型命令行客户端,提升数据操作与调试效率
1. 项目概述与核心价值最近在开源社区里,KafClaw 这个项目引起了不少关注。乍一看这个名字,你可能会联想到 Apache Kafka 和某种“爪子”(Claw)的结合,没错,这正是它的精髓所在。KafClaw 本质上是一个针对 …...
