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=-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()<<"处理自定义事件完毕";

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习设计模式之享元模式,但是宝可梦

前言 作者在准备秋招中&#xff0c;学习设计模式&#xff0c;做点小笔记&#xff0c;用宝可梦为场景举例&#xff0c;有错误欢迎指出。 享元模式 1 介绍 享元模式很好理解&#xff0c;它主要是为了减少创建对象的数量&#xff0c;属于结构型设计模式 目的&#xff1a;减少…

高效多用的群集-Haproxy搭建Web集群

Haproxy搭建 Web 群集 一、Haproxy前言 HAProxy是一个使用c语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TcP和HrrP的应用程序代理。HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。…

Leetcode77. 组合

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 回溯剪枝 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution {public List<List<Integer>> combine(int n, i…

Android App的设计规范

Android App 设计规范是为开发者和设计师提供的一系列准则和建议&#xff0c;以确保应用在 Android 设备上的外观、交互和用户体验保持一致。以下是一些常见的 Android App 设计规范要点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

新生报到:无压力的数字自我介绍

&#x1f338; 新生报到&#xff1a;无压力的数字自我介绍 &#x1f338; 开学季又来临&#xff0c;每个学校、每个班级都迎来了一批新鲜面孔。作为新生&#xff0c;面对陌生的环境和同学&#xff0c;首次的自我介绍无疑是一个让许多人感到紧张和迷茫的挑战。你是否曾因为害羞…

学习高等数学需要的初等数学知识

文章目录 名词解释常用希腊字符读音幂、根式和对数常用的三角函数值三角函数变换一元二次方程求解充分条件和必要条件切线方程、斜率和法线隐函数极坐标排列组合 名词解释 教材中存在着许多熟悉且陌生的词汇&#xff0c;作者在此进行了整理&#xff1a; 概念&#xff1a;概念…

【Linux】【驱动】驱动挂载的时候给驱动传递参数

【Linux】【驱动】驱动挂载的时候给驱动传递参数 绪论1.什么是驱动传参驱动传参就是传递参数给我们的驱动举例:2.驱动传参数有什么作用呢?3. 传递单个参数使用如下的数组4. 传递数组使用以下函数&#xff1a; 传递数字值代码指令 传递数组代码传递数组指令 绪论 1.什么是驱动…

【C进阶】指针(一)

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a; 指针的主题&#xff0c;在初阶指针章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址的唯一标识一块内存空间&#xff08;指针变量&#xff09;&a…

战略在集体学习过程中涌现

战略学习派&#xff1a;战略是涌现的学习过程&#xff0c;中国人的话&#xff0c;要交学习费&#xff01;【安志强趣讲269期】 趣讲大白话&#xff1a;出来混总要交学费 **************************** 中国人有这个意识 新进一个领域&#xff0c;要交学费&#xff0c;有学习过程…

虚拟机中Ubuntu 16.04 设置网络

1、打开虚拟机的“编辑”选项&#xff0c;选择“虚拟网络编辑器”&#xff0c;修改网络配置 2、同时打开 Windows下面的命令行&#xff0c;输入ipconfig&#xff0c;看到虚拟网络适配器的地址 1-虚拟机-设置-网络适配器 2-编辑-虚拟网络编辑器-VMnet0 3-编辑-虚拟网络编辑…

线性代数的本质笔记(3B1B课程)

文章目录 前言向量矩阵行列式线性方程非方阵点积叉积基变换特征向量与特征值抽象向量空间 前言 最近在复习线代&#xff0c;李永乐的基础课我刷了一下&#xff0c;感觉讲的不够透彻&#xff0c;和我当年学线代的感觉一样&#xff0c;就是不够形象。 比如&#xff0c;行列式为…

KVM虚拟化平台安装及创建虚拟机

文章目录 一、KVM 简介二、安装KVM虚拟化平台1、方式一&#xff1a;安装操作系统时&#xff0c;添加虚拟化功能2、方式二&#xff1a;基于现有系统&#xff0c;安装虚拟化功能3、验证KVM安装是否无误 三、创建虚拟机1、创建虚拟机前环境准备工作2、创建CentOS7.5系统虚拟机 一、…

数据结构(Java实现)LinkedList与链表(上)

链表 逻辑结构 无头单向非循环链表&#xff1a;结构简单&#xff0c;一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构&#xff0c;如哈希桶、图的邻接表等等。 无头双向链表&#xff1a;在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。 链表的…

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程

几个月之前写的一个项目&#xff0c;通过这个项目&#xff0c;你能学到关于数据库的触发器知识&#xff0c;python的基本语法&#xff0c;python一些第三方库的使用&#xff0c;包括python如何将前后端连接起来&#xff08;界面和数据&#xff09;&#xff0c;还有界面的设计等…

实战项目 在线学院springcloud调用篇3(nacos,feging,hystrix,gateway)

一 springcloud与springboot的关系 1.1 关系 1.2 版本关系 1.3 list转json串 public class Test {public static void main(String[] args) {List<String> dataListnew ArrayList<String>();dataList.add("12");dataList.add("45");dataLi…

RabbitMQ死信队列

RabbitMQ死信队列 1、过期时间TTL 过期时间TTL表示可以对消息设置预期的时间&#xff0c;在这个时间内都可以被消费者接收获取&#xff1b;过了之后消息将自动被 删除。RabbitMQ可以对消息和队列设置TTL&#xff0c;目前有两种方法可以设置&#xff1a; 第一种方法是通过队列…

#systemverilog# 之 event region 和 timeslot 仿真调度(六)疑惑寄存器采样吗

一 象征性啰嗦 想必大家在刚开始尝试写Verilig HDL代码的时候,都是参考一些列参考代码,有些来自于参考书,有些来自于网上大牛的笔记,甚至有写来自于某宝FPGA开发板的授权代码。我还记得自己当时第一次写代码,参考的是一款Altera 芯片,结合Quartus 开发软件, 在上面练习…

【Go Web 篇】Go 语言进行 Web 开发:构建高性能网络应用

随着互联网的快速发展&#xff0c;Web 开发已经成为了软件开发领域中不可或缺的一部分。随之而来的是对于更高性能、更高效的网络应用的需求。在这个领域&#xff0c;Go 语言因其并发性能、简洁的语法以及丰富的标准库而备受关注。本篇博客将深入探讨如何使用 Go 语言进行 Web …

requests模板成功下载,但是不能在pycharm中运行

在做实验的过程中&#xff0c;需要用到requests&#xff0c;但是在pycharm中成功下载&#xff0c;仍然无法使用&#xff0c;找了很久&#xff0c;解决方法如下&#xff1a; 进入win中的命令提示符 下载requests模块 pip install requests输入python显示你的python的基本信息&…

分布式数据库架构:高可用、高性能的数据存储

在现代信息时代&#xff0c;数据是企业发展的核心。为了支持海量数据的存储、高并发访问以及保证数据的可靠性&#xff0c;分布式数据库架构应运而生。分布式数据库架构是一种将数据存储在多个物理节点上&#xff0c;并通过一系列复杂的协调和管理机制来提供高可用性和高性能的…