c++ qt--事件过滤(第七部分)

c++ qt–事件过滤(第七部分)

一.为什么要用事件过滤

上一篇博客中我们用到了事件来进行一些更加细致的操作,如监控鼠标的按下与抬起,但是我们发现如果有很多的组件那每个组件都要创建一个类,这样就显得很麻烦,所以我们就可以引入事件过滤了,事件过滤不需要创建类,只需要安装过滤器然后重写过滤器函数就可以了

二.写一个使用了事件过滤例子

1.所用到组件如下

在这里插入图片描述

这里还用到了栅格布局

2.安装过滤器

在mainwindow.cpp的构造函数中写下面代码

ui->lineEdit->installEventFilter(this/*参数得是对象*/);//安装过滤器,相当于某个组件安装监控,查看的权力交给MainWindow(物业)
ui->plainTextEdit->installEventFilter(this);//安装过滤器,相当于某个组件安装监控,查看的权力交给MainWindow(物业)

3.重写过滤器函数

1.声明

在mainwindow.h的类中写下面代码

public:bool eventFilter(QObject *watched, QEvent *event);

2.定义

在mainwindow.cpp中写下面代码

bool MainWindow::eventFilter(QObject *watched, QEvent *event){if(watched==ui->lineEdit){//如果是密码组件if(event->type()/*获取事件的类型*/==QEvent::KeyPress){//如果是键盘按下的事件QKeyEvent* pKey=(QKeyEvent*)event;//相当于是强转成具体事件的指针if(pKey->key()>=Qt::Key_A&&pKey->key()<=Qt::Key_Z){//如果是字母qDebug()<<"放行"<<pKey->key();return false;//不过滤,(放行)}else{qDebug()<<"过滤"<<pKey->key();return true;//过滤(不放行)}}}else if(watched==ui->plainTextEdit){//如果是多行文本输入框if(event->type()==QEvent::Wheel){//如果是滑轮按下的事件QWheelEvent* pWheel =(QWheelEvent*)event;//相当于是强转成具体事件的指针if(pWheel->buttons()==Qt::MidButton){//如果按下鼠标中间qDebug()<<"x == "<<pWheel->angleDelta().x();//alt+上:y=120 alt+下:y=-120qDebug()<<"y == "<<pWheel->angleDelta().y();//上:y=120 下:y=-120int y=pWheel->angleDelta().y();if(y>0){ui->plainTextEdit->zoomIn();//放大}else if(y<0){ui->plainTextEdit->zoomOut();//缩小}return true;//过滤(不放行),事件在这里已经被处理了,没必要继续分发了}}}return QMainWindow::eventFilter(watched,event);
}

三.写一个给两个数进行运算的例子(自定义事件)

1.用到的组件如下

在这里插入图片描述

这里还用到了栅格布局

2.给使用的Combo Box组件(下拉框)加上计算的规则,+ - * /

在mainwindow.cpp的构造函数中写下面代码

QStringList list={"+","-","*","/"};ui->comboBox->addItems(list);

3.通过点击按钮(计算),进行计算操作

1.添加信号槽

在这里插入图片描述

2.声明槽函数(对点击按钮后做出反应的函数)

在mainwindow.h的类中

private slots://使用qt中自带的方法添加槽函数,会自动添加声明,信号与槽函数的连接也会帮你写好,这里我没有展示代码void on_pushButton_clicked();

3.创建一个类文件(用来自定义事件)

在这里插入图片描述

在这里插入图片描述

4.修改类

在myevent.h中进行的修改
在这里插入图片描述

在myevent.cpp中进行的修改

在这里插入图片描述

5.在类中添加属性

在myevent.h中的类中写下面代码

public:int m_a;int m_b;QString m_str;

6.再建一个窗口用来接收事件

1.创建窗口

在这里插入图片描述

在这里插入图片描述

2.此窗口使用的组件如下

在这里插入图片描述

3.定义一个对象

在main.cpp中写下面代码

在全局定义一个指针来指向对象

Dialog* pDlg=nullptr;

在main函数中定义对象

Dialog dia;
pDlg=&dia;//指针指向对象

7.定义槽函数

在mainwindow.cpp中写下面代码

QEvent::Type myType=QEvent::User;//自定义事件的ID  (1000)void MainWindow::on_pushButton_clicked()
{//获得两个数字 和 规则int a=ui->spinBox->value();int b=ui->spinBox_2->value();QString str=ui->comboBox->currentText();//自定义事件,并携带信息//MyEvent myEve(myType);//定义一个对象myEve.m_a=a;myEve.m_b=b;myEve.m_str=str;//发射自定义事件extern Dialog* pDlg;//外部声明,可以让变量进行跨文件使用//第一种方法//下面函数发送事件,是阻塞的,等待对方处理完毕后,再返回,继续执行下面的代码(类似于打电话)//QCoreApplication::sendEvent(pDlg,&myEve);//发送自定义事件//qDebug()<<"sendEvent over";//第二种方法MyEvent* pEve=new MyEvent(myType);//在堆区创造一个对象,防止此函数结束对象被回收pEve->m_a=a;pEve->m_b=b;pEve->m_str=str;//发送事件,非阻塞,投递完之后立即返回继续执行下面的代码(类似于发短信)QCoreApplication::postEvent(pDlg,pEve);qDebug()<<"postEvent over";
}

8.重写接收自定义事件并进行处理的函数

1.声明

在dialog.h中写下面代码

public: virtual void customEvent(QEvent *event);
2.定义

在dialog.cpp中写下面代码

void Dialog::customEvent(QEvent *event)
{extern QEvent::Type myType;//外部声明,可以让变量进行跨文件使用if(event->type()==myType){MyEvent* pEve=(MyEvent*)event;//强转为自定义事件int res=0;//结果if(pEve->m_str=="+"){res=pEve->m_a+pEve->m_b;}else if(pEve->m_str=="-"){res=pEve->m_a-pEve->m_b;}else if(pEve->m_str=="*"){res=pEve->m_a*pEve->m_b;}else if(pEve->m_str=="/"){res=pEve->m_a/pEve->m_b;}ui->label->setText(QString("规则:%1,结果%2").arg(pEve->m_str).arg(res));this->show();}qDebug()<<"处理自定义事件完毕";

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

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

相关文章

GO语言:Worker Pools线程池、Select语句、Metex互斥锁详细示例教程

目录标题 一、Buffered Channels and Worker Pools1. Goroutine and Channel Example 线程和通道示例2. Deadlock 死锁3. Closing buffered channels 关闭通道4. Length vs Capacity 长度和容量5. WaitGroup6. Worker Pool Implementation 线程池 二、Select1. Example2. Defau…

IO进程线程,文件与目录,实现linux任意目录下ls -la

注意文件的名字、路径是如何输入的。 函数opendir打开目录&#xff0c;struct dirent&#xff0c;struct stat这些结构体的含义。 readdir()函数是一个用于读取目录内容的系统调用或库函数&#xff0c;在类Unix操作系统中&#xff08;如Linux&#xff09;广泛使用。它用于遍历…

python爬虫10:selenium库

python爬虫10&#xff1a;selenium库 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产…

leetcode算法题--复杂链表的复制

原题链接&#xff1a;https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/description/?envTypestudy-plan-v2&envIdcoding-interviews 感觉一开始想到的办法还是比较笨 /*** Definition for a Node.* type Node struct {* Val int* Next *Node* …

C语言练习题Day1

从今天开始分享C语言的练习题&#xff0c;每天都分享&#xff0c;差不多持续16天&#xff0c;看完对C语言的理解可能更进一步&#xff0c;让我们开始今天的分享吧&#xff01; 题目一 执行下面的代码&#xff0c;输出结果是&#xff08;&#xff09; int x5,y7; void swap()…

Qt --- 对象树机制、析构顺序导致崩溃

{QWidget widget;QPushButton buttonQuit("Quit",&widget); } 作为父组件的widget&#xff0c;子组件buttonQuit都是QObject的子类&#xff1b;上述代码运行没有问题。 代码析构时&#xff0c;因为C的要求&#xff0c;局部对象的析构时按照实例化顺序逆向的顺序…

「MySQL-01」MySQL基础

目录 一、数据库概念 1. 什么是数据库 2. 为什么要有数据库&#xff1f; 3. 数据库将数据存在哪里&#xff1f; 二、知名数据库介绍 1.知名数据库介绍 2.为什么要学习MySQL 三、MySQL的基本使用 0. 安装MySQL 1. 数据库客户端链接服务端 2. Windows下的MySQL服务端管理 3. 数据…

昌硕科技、世硕电子同步上线法大大电子合同

近日&#xff0c;世界500强企业和硕联合旗下上海昌硕科技有限公司&#xff08;以下简称“昌硕科技”&#xff09;、世硕电子&#xff08;昆山&#xff09;有限公司&#xff08;以下简称“世硕电子”&#xff09;的电子签项目正式上线。上线仪式在上海浦东和硕集团科研大楼举行&…

flowable源码解析之分析环境搭建

系列文章目录 第一章 源码分析环境搭建 第二章 流程引擎启动(一) 第三章 流程引擎启动(二) 第四章 流程引擎启动(三) 第五章 流程引擎启动(四) 第六章 流程部署 第七章 流程模型解析 第八章 流程的发起 第九章 数据存储机制 文章目录 系列文章目录一、Flowable源码分析…

使用fastjson2的@JSONField注解解决日期格式记录

最近在做一个三方对接&#xff0c;对方的日期格式数据要求时间日期格式: yyyyMMddHHmmss或者 yyyyMMdd&#xff0c;我一下想起了fastjson2工具包&#xff0c;所以很愉快的解决了此问题。 依赖jar如下&#xff1a; <dependency><groupId>com.alibaba.fastjson2</…

mysql 触发器格式,修改触发器,创建触发器,触发条件

1.查询所有触发器 show triggers; 2.创建触发器 #修改结束符 delimiter $$create trigger <自定义出发名> after insert on <所监听的表名> for each row begin#执行多条sql语句#拿到监听数据 关键字 new/old 即 新数据/旧数据update classify set cat_num cat…

每日一博 - 闲聊云原生和容器编排

文章目录 概念1. 云原生&#xff08;Cloud Native&#xff09;&#xff1a;2. 容器编排&#xff08;Container Orchestration&#xff09;&#xff1a; 小结 概念 云原生和容器编排是两个不同的概念&#xff0c;但它们之间有着密切的联系。下面将分别介绍这两个概念&#xff0…

day-02 套接字类型与协议设置、地址族和数据序列

一.套接字类型 1.面向连接的套接字&#xff08;SOCK_STREAM&#xff09; 特点&#xff1a; 传输过程中数据不会消失按顺序传输数据传输的数据不存在数据边界 2.面向消息的套接字&#xff08;SOC_DGRAM&#xff09; 特点&#xff1a; 强调快速传输而非传输顺序传输的数据可…

【C++】const成员 | 取地址运算符重载

Ⅰ. const成员 两种const 我们知道&#xff0c;用const修饰 能起到保护&#xff0c;使之不被修改的作用。 修饰指针的const有两种位置&#xff1a; 我们学过的this指针&#xff0c;就被后者所修饰&#xff0c;因此无法被修改。 const成员函数 ➡️为了保护函数里的成员&…

《Java极简设计模式》第05章:原型模式(Prototype)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

【日常积累】Linux下sftp搭建

概述 SFTP是Secure File Transfer Protocol的缩写&#xff0c;是安全文件传送协议。可以为传输文件提供一种安全的加密方法。跟ftp几乎语法功能一样。 SFTP是SSH的一部分&#xff0c;是一种传输档案至Blogger伺服器的安全方式。它本身没有单独的守护进程&#xff0c;必须使用s…

Elasticsearch 8.X reindex 源码剖析及提速指南

1、reindex 源码在线地址 为方便大家验证&#xff0c;这里给出 reindex github 源码地址。 https://github.com/elastic/elasticsearch/blob/001fcfb931454d760dbccff9f4d1b8d113f8708c/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java reindex 常见…

开源软件的崛起:历史与未来

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Lambda函数

一.概念 1.利用lambda表达式可以编写内嵌的匿名函数&#xff0c;用以替换独立函数或者函数对象 2.每当你定义一个lambda表达式后&#xff0c;编译器会自动生成一个匿名类&#xff08;这个类当前重载了&#xff08;&#xff09;运算符&#xff09;&#xff0c;我们称为闭包类型…

8.6 【C语言】返回指针值的函数

一个函数可以返回一个整型值、字符值、实型值等&#xff0c;也可以返回指针型的数据&#xff0c;即地址。 类型名 *类型名&#xff08;参数表列&#xff09; 例8.25 有a个学生&#xff0c;每个学生有b门课程的成绩。要求在用户输入学生序号以后&#xff0c;能输出该学生的全部…