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

news2024/9/28 19:18:01

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=-120
                qDebug()<<"y == "<<pWheel->angleDelta().y();//上:y=120 下:y=-120

                int 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.coloradmin.cn/o/933780.html

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

相关文章

Vue3.0 新特性以及使用变更总结

Vue3.0 在2020年9月正式发布了&#xff0c;也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发&#xff0c;这篇文章就是在使用后的一个总结&#xff0c; 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…

亚马逊云科技 re:Inforce 大会云安全合规与技术实践及 Security Jam 大赛,快来报名吧!...

‍‍ 2023年8月31日在北京 亚马逊云科技 re:Inforce 大会 首次登陆中国&#xff01; 我们期待您的莅临&#xff0c; 并与您一起迎接 AI 时代&#xff0c; 开启全面智能的安全旅程&#xff01; 在13:00-17:00的 培训与动手实验环节中 云安全合规与技术实践 及 Security Jam 大赛…

APP爬虫之-Protobuf协议逆向解析

在做APP抓取时&#xff0c;会发现有的APP Response回来的数据有“加密”。不知道返回的内容是什么。 如下&#xff1a; 如上&#xff0c;内容不是明文的&#xff0c;没办法解析数据。APP常见的对数据加密有三种情况&#xff1a;第一种是&#xff0c;用诸如AES这类加密算法对数…

图神经网络和分子表征:3. 不变网络最后的辉煌

写这篇文章的时候已经是2023年的8月份&#xff0c;GNN for molecule property prediction 这个小领域正在变得火热起来&#xff0c;各大榜单被不断刷新&#xff0c;颇有当年 CNN 刷榜 imagenet 的势头。 由于对力、维里等性质有着内禀优势&#xff0c;当下高居榜首的模型毫无疑…

设计模式--工厂模式(Factory Pattern)

一、 什么是工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但是将对象的实例化过程推迟到子类中。工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象&#xff0c;而无需暴露对…

<C++> STL_vector

1.vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它的…

【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

【JavaEE】Spring事务&#xff08;1&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. 为什么要使用事务2. Spring中事务的实现2.1 事务针对哪些操作2.2 MySQL 事务使用2.3 Spring 编程式事务&#xff08;手动挡&#xff09;2.4 Spring 声明式事务&#…

匈牙利算法 in 二分图匹配

https://www.luogu.com.cn/problem/P3386 重新看这个算法&#xff0c;才发现自己没有理解。 左边的点轮流匹配&#xff0c;看是否能匹配成功。对右边的点进行记录是否尝试过 然后有空就进&#xff0c;别人能退的就进 遍历左部点&#xff1a; 尝试匹配过程&#xff1a;

报错处理:Docker容器无法启动

具体报错&#xff1a; Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"program\": executable file not found in $PATH": unknown. 报错环境&#xff1a; 该报错出现在使用…

网络编程套接字(2): 简单的UDP网络程序

文章目录 网络编程套接字(2): 简单的UDP网络程序3. 简单的UDP网络程序3.1 服务端创建(1) 创建套接字(2) 绑定端口号(3) sockaddr_in结构体(4) 数据的接收与发送接收发送 3.2 客户端创建3.3 代码编写(1) v1_简单发送消息(2) v2_小写转大写(3) v3_模拟命令行解释器(4) v4_多线程版…

软件测试 day3

今天目标 执行用例&#xff08;课上案例编写的用例&#xff09; 缺陷相关知识 能够说出软件缺陷判定标准 能够说出项目中缺陷的管理流程 能够使用Excel对于缺陷进行管理 能使用工具管理缺陷一、用例执行 说明&#xff1a;执行结果与用例的期望结果不一致&#xff08;含义&…

Lingo软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Lingo是一款专门为解决线性和非线性优化问题而设计的专业软件&#xff0c;广泛应用于运筹学、工程管理、交通管理、生产调度、物流管理等领域。它提供了一个易于使用的界面和灵活的求解器&#xff0c;能够高效地求解大规模的线性…

前端需要理解的Vue知识

1 模板语法 Vue使用基于 HTML 的模板语法&#xff0c;能声明式地将其组件实例的数据绑定到DOM。所有Vue 模板可以被符合规范的浏览器和 HTML 解析器解析。Vue 会将模板编译成高度优化的 JavaScript 代码。结合响应式系统&#xff0c;当应用状态变更时&#xff0c;Vue 能够智能…

Android 实现资源国际化

前言 国际化指的是当Android系统切换语言时&#xff0c;相关设置也随之改变&#xff0c;从而使用不同的国家地区&#xff1b; 简而言之&#xff0c;就是我们的Android App中的文字和图片会随着不同国家的地区变化从而切换为不同语言文字和不同国家的图片 文字图片国际化 只要…

Python绘图系统9:新建绘图类型控件,实现混合类型图表

文章目录 绘图类型控件改造AxisList更改绘图逻辑源代码 Python绘图系统&#xff1a; 从0开始实现一个三维绘图系统自定义控件&#xff1a;坐标设置控件&#x1f4c9;坐标列表控件&#x1f4c9;支持多组数据的绘图系统图表类型和风格&#xff1a;散点图和条形图&#x1f4ca;混…

【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“

问题描述 由于项目需要&#xff0c;需要在代码中使用POST请求去调用另一个服务的接口&#xff0c;即不通过前端&#xff0c;A 项目直接在方法中发起HTTP请求调用 B 项目的接口&#xff0c;当请求体中的参数有中文时&#xff0c;参数接收后中文会变为“?”。 具体原因是参数的…

玩转git第7章节,本地git的用户名和密码的修改

一 本地git的用户名和密码 1.1 本地用户名和密码修改 1.本地用户名修改 2.凭据管理 3.进行修改密码 1.2 代码提交操作

8、Spring_整合Mybatis

五、Spring整合Mybatis 1.添加依赖 添加依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.17.RELEASE</version></dependency><depend…

Nuxt.js--》添加路由、视图和过渡效果

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

LibreOffice新一代的办公软件for Mac/Windows免费版

LibreOffice是一款免费、开源的办公软件套件&#xff0c;可在多个操作系统上运行&#xff0c;包括Windows、Mac和Linux。它提供了一系列功能强大的办公工具&#xff0c;包括文档处理、电子表格、演示文稿、数据库管理等。 LibreOffice的界面简洁直观&#xff0c;与其他流行的办…