Qt-事件与信号

        事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。

        在使用界面组件作为交互操作编程的时候,我们通常选择合适的信号,为该信号编写槽函数。但是Qt的界面组件只将少数事件进行封装成了信号,对于某些事件可能缺少对应的信号,例如QLabel的信号中就没有与双击鼠标对应的信号
        在这种情况下我们可以从QLabel继承定义一个新的标签类,通过自定义信号和事件处理,使新的标签类具有处理鼠标双击事件的信号。

        函数event()的作用

        应用程序派发给界面组件的事件首先会由其函数event()处理,如果函数event()不做任何处理,组件就会自动调用QWidget中与事件类型对应的默认事件处理函数,从QWidget派生的界面组件一般不需要重新实现函数event(),如果对某种事件进行处理,可以重新实现其对应的事件处理函数。
        QWidget类针对一些典型事件编写了事件处理函数,但是某些类型的事件没有对应的事件处理函数,例如,对于QEvent::HoverEnter和QEvent::HoverLeave类型的事件,QWidget类中就没有对应的事件处理函数,这种情况下,如果要对QEvent::HoveEnter和QEvent::HoveLeave类型的事件进行处理,就需要自定义一个类,重新实现函数event(),判断事件类型,针对QEvent::HoveEnter和QEvent::HoveLeave类型的事件进行对应的处理。

 注意,TMyLabel中的构造函数我是改变了其中参数的,因为使用创建C++类向导自动生成的TMyLabel的构造函数是没有任何参数的,这样是不对的,因为界面组件必须要有一个父容器组件

注意在构造函数中我们将TMyLabel的Qt::WA_Hover属性设置为true(默认值是false)。这样鼠标光标移入和移出才会分别产生QEvent::HoveEnter和QEvent::HoveLeave类型的事件。 

        事件过滤器

        一个界面组件如果要对事件进行处理,需要从父类继承定义一个新类,在新类里编写程序直接处理事件,或者将事件转换成信号。
        如果不想定义一个新的类,可以用事件过滤器对界面组件的事件进行处理。事件过滤器是QObject提供的一种处理事件的方法,它可以将一个对象的事件委托给另一个对象来监听并处理。

        事件过滤器工作原理

        QObject提供了一种处理事件的方法,事件过滤器。它可以将一个对象的事件委托给另一个对象来监视并处理。例如,一个窗口可以作为其他界面上的QLabel组件的事件过滤器,派发给QLabel组件的事件由窗口去处理,这样,就不需要为了处理某种事件而新定义一个标签类。
        要实现事件过滤器功能,需要完成两项操作。
        (1)被监视对象使用函数installEventFilter()将自己注册给监视对象,监视对象就是事件过滤器。
        (2)监视对象重新实现eventFilter()函数,对监视到的事件进行处理。
       installEventFilter()和eventFilter()都是QObject类定义的公有函数,函数installEventFilter()的原型定义如下:

  void QObject::installEventFilter(QObject* filterObj)
        被监视的对象调用installEventFilter(),将对象filterObj设置为自己的事件过滤器。
        函数eventFilter()的原型定义如下:

bool QObject::eventFilter(QObject* watched , QEvent* event)
        作为事件过滤器的监视对象需要重新实现eventFilter(),参数watched
是被监视的对象,event是产生的事件。这个函数有一个返回值,如果返回true,事件就不会再传播给其他对象,事件处理结束,如果返回false,事件会继续传播给事件接受者做进一步处理。

注意eventFilter()函数结尾不能直接返回true,如果返回true的话,事件过滤器拦截的事件不会继续传播给被监视对象,而在这个类的eventFilter()函数中,我们只处理了被监视对象的少数几个事件件,例如QEvent::Paint类型的事件就没有处理,程序运行时界面上根本就不显示标签的文字。

注意 QEvent::Enter和QEventLeave两个类型的事件,它们与QEvent::HoverEnter和QEvent::HoverLeave类型的事件功能相似,只是使用Hover事件时,需要将组件的mouseTracking属性设置为true,而使用QEvent::Enter和QEventLeave两个类型的事件时无需设置这个属性

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

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

相关文章

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写,它是Android SDK 中的一个调试工具,允许开发者通过命令行界面与设备进行交互,执行各种操作,如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

鸿蒙语言基础类库:【@system.mediaquery (媒体查询)】

媒体查询 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.mediaquery]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import mediaquery from sy…

PySide在Qt Designer中使用QTableView 显示表格数据

在 PySide6 中,可以使用 Qt Model View 架构中的 QTableView 部件来显示和编辑表格数据。 1、创建ui文件 在Qt Designer中新建QMainWindow,命名为csvShow.ui。QMainWindow上有两个部件:tableview和btn_exit。 2、使用pyuic工具将ui文件转换为…

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…

从零开始读RocketMq源码(五)Consumer消费Message流程解析

目录 前言 准备 拉取服务和重平衡服务启动 初识PullRequest 重平衡服务 对重平衡资源进行排序 MessageQueue消息队列集合来源 Consumer消费者集合数据来源 确实分配资源策略 执行分配策略 初始化ProcessQueue 初始化PullRequest 内存队列填充PullRequest 消息拉取…

TikTok用户必看:代理IP的优缺点深度剖析

在咱们这庞大的网络世界里,TikTok就像是夜空中最亮的星星,吸引着全世界的人们。它不仅仅是个让大家开心的地方,更是个能让不同地方的人互相了解、分享生活的神奇平台。但你有没有想过,要是能让这个连接更顺畅,让TikTok…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

【CSS in Depth 2 精译_019】3.2 CSS 的盒模型

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

LLaMA 数据集

LLaMA的训练数据集来源多样&#xff0c;涵盖了多个不同的数据集和预处理步骤。以下是详细的描述&#xff1a; 公开数据来源和预处理 CommonCrawl [67%]&#xff1a; 使用CCNet管道&#xff08;Wenzek等人&#xff0c;2020年&#xff09;对2017年至2020年间的五个CommonCrawl转…

Vue3 + uni-app 微信小程序:仿知乎日报详情页设计及实现

引言 在移动互联网时代&#xff0c;信息的获取变得越来越便捷&#xff0c;而知乎日报作为一款高质量内容聚合平台&#xff0c;深受广大用户喜爱。本文将详细介绍如何利用Vue 3框架结合微信小程序的特性&#xff0c;设计并实现一个功能完备、界面美观的知乎日报详情页。我们将从…

生成式AI的未来:对话的艺术与代理的实践

生成式 AI 的发展方向&#xff0c;是 Chat 还是 Agent&#xff1f; 随着生成式AI技术的不断进步&#xff0c;关于其未来发展方向的讨论也愈发激烈。究竟生成式AI的未来是在对话系统&#xff08;Chat&#xff09;中展现智慧&#xff0c;还是在自主代理&#xff08;Agent&#x…

《驾驭AI浪潮:伦理挑战与应对策略》

AI发展下的伦理挑战&#xff0c;应当如何应对&#xff1f; 人工智能飞速发展的同时&#xff0c;也逐渐暴露出侵犯数据隐私、制造“信息茧房”等种种伦理风险。随着AI技术在社会各个领域的广泛应用&#xff0c;关于AI伦理和隐私保护问题日趋凸显。尽管国外已出台系列法规来规范…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

【扁平化多级双向链表】python刷题记录

进入链表的遍历模块了 好复杂的题目描述。。。 DFS深度遍历扁平拼接 """ # Definition for a Node. class Node:def __init__(self, val, prev, next, child):self.val valself.prev prevself.next nextself.child child """class Soluti…

Windows双网卡上网原理以及配置方法

目录 1. 背景 2. IP路由原理 3. windows双网卡上网解决方案 3.1. 基础配置解决方案 3.2. 高阶配置解决方案 1. 背景 在windwos上使用多网卡在工作和生活中是一个常见的操作&#xff0c;比如为了获取内部消息将有线连接到内部局域网中&#xff0c;为而了访问外网又将电脑的…

申请https证书的具体流程

申请HTTPS证书的具体流程通常涉及以下步骤&#xff0c;不过请注意&#xff0c;具体细节可能因不同的证书颁发机构&#xff08;CA&#xff09;而有所差异&#xff1a; 1、确定证书类型&#xff1a; 证书类型&#xff1a;根据需求选择合适的SSL证书类型。常见的有DV&#xff08;…

Windows下使用Cygwin创建rsync服务端

1 下载Cygwin 访问官网Cygwin&#xff0c;点击setup-X86_64.exe即可开始下载 2 安装 前面全部默认。路径可以自己选择&#xff0c;站点选阿里云的&#xff0c;等待安装即可 3 配置 使用打开Cygwin安装后创建的快捷方式窗口&#xff0c;输入下面的指令将windows用户导入到cyg…

如何将几百兆的包优化到几十兆----记一次vue项目的打包优化过程

打包优化 现象 前段时间开发的时候遇到客户反馈的一个问题 界面无法打开&#xff0c;显示白屏&#xff0c;控制台无报错 经过我们在开发环境&#xff0c;测试环境反复测试都没复现出客户的问题&#xff0c;然后我们又不停的在生产环境上找问题&#xff0c;也没复现出来 最…

正点原子imx6uSD卡复制files文件到u盘rootfs的root内失败

进入rootfs的home目录 再进入root&#xff0c;一般是要输入密码的&#xff0c;更改权限&#xff0c;设置全部可以读写&#xff0c;删除原有的文件。再把files文件夹复制过来就行 后面找不带分区&#xff0c;哎。相当于内存卡就是启动u盘&#xff0c;进入了linux系统&#xff0c…

彻底解决idea的编解码问题

一、打开idea,找到Setting,点击File Encoding编解码设置,将以下标红的三个部分全部设置为UTF-8.同理如果你的项目使用的是GBK或者其他编码格式,那么也设置为统一。 二、点击Java Compiler设置补齐-encoding utf-8参数 三、如果你的项目使用到了tomcat,那么需要配置下tomca…