Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

news2024/12/23 23:20:58

目录

  • 1、需求背景
  • 2、使用Qt键盘事件
  • 3、安装事件过滤器
  • 4、事件处理级别


1、需求背景

现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。
在这里插入图片描述

2、使用Qt键盘事件

一种更为直接的解决方案是子类化QLineEdit并且重新实现鼠标事件keyPressEvent() ,然后调用focusNextChild()

首先需要创建一个子类MyLineEdit继承于QLineEdit类。然后重写键盘摁下事件。当识别到案件为空格时,就将鼠标焦点切换到下一个。

void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    if(event->key() == Qt::Key_Space)
    {
        focusNextChild();
    }
    else
    {
        QLineEdit::keyPressEvent(event);
    }
}

然后在ui上将对应的QLineEdit控件提升为MyLineEdit类。
在这里插入图片描述

运行代码进行测试,效果如下:
在这里插入图片描述

这种方法有一个主要的缺点:如果在窗体中使用了好几种不同类型的窗口部件(例如, QComboBox和QSpinBox),我们也必须对它们逐一子类化,以便让它们能够实现相同的行为。一个更好的解决方案是让主窗口监视它的子窗口部件中键的按下事件并且在监视代码中实现所需的行为。这种方法可以通过使用事件过滤器来实现。

3、安装事件过滤器

创建一个事件过滤器包括如下两步过程:
1.通过对目标对象调用installEventFilter()来注册监视对象。
2.在监视对象的eventFilter()函数中处理目标对象的事件。

Qt事件模型一个非常强大的功能是:QObject实例在看到它自己的事件之前,可以通过设置另外一个00bject实例先监视这些事件。

在构造函数中注册监视对象

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->lineEdit->installEventFilter(this);
    ui->lineEdit_2->installEventFilter(this);
    ui->lineEdit_3->installEventFilter(this);
}

这个事件过滤器一旦注册,发送给lineEdit、 lineEdit_2和lineEdit_3窗口部件的事件就会在它们到达目的地之前先被发送给 MainWindow的eventFilter()函数。

bool MainWindow::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->lineEdit ||
        target == ui->lineEdit_2 ||
        target == ui->lineEdit_3)
    {
        if(event->type() == QEvent::KeyPress)
        {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            qDebug() << "key:" << QString::number(keyEvent->key());
            if(keyEvent->key() == Qt::Key_Space)
            {
                qDebug() << "1";
                focusNextChild();
                return true;
            }
        }
    }
    return QMainWindow::eventFilter(target, event);
}

首先,需要检查一下目标窗口部件是不是QLineEdit中的一个。如果事件是一个按键事件,那么就把它强制转换为QKeyEvent并且检查按下的是哪个键。如果按下的键是空格键,那么就调用focusNextChild()把焦点传递到焦点序列中的下一个窗口部件并且返回true,告诉Qt已经处理了这个事件。如果返回false, Qt将会把这个事件发送给指定的目标对象,而在这个QLineEdit中产生一个虚假的空格插入操作。

如果窗口部件不是QLineEdit,或者该事件不是一个空格按键事件,那么就把控制权传递给它的基类的eventFilter()来执行。这个目标窗口部件也可能是某个基类正在监控的窗口部件。

效果和重写案件事件一样,但是省事很多。

4、事件处理级别

Qt提供了5个级别的事件处理和事件过滤方法。

  1. 重写控件的事件处理函数:如重写keyPressEvent()mousePressEvent()paintEvent(),这是最常用的事件处理方法。

  2. 重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。

  3. 给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活先到达最近安装的监视对象,最后到达最先安装的监视对象。

  4. QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。

  5. 继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。

许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。

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

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

相关文章

【SpringCloud-6】Config配置中心

集群环境下&#xff0c;服务节点很多&#xff0c;我们不可能对每个服务都维护一套自己的配置&#xff0c;有修改时把每个节点都改一遍。 所以需要一个公共的配置文件&#xff0c;并且还能实现动态刷新。 在springcloud中&#xff0c;springcloud config组件就是一个配置中心&…

8年测试老鸟整理,软件测试面试问题-初中级,全覆盖问题...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一般测试面试分为…

pytorch动态调整学习率torch.optim.lr_scheduler import MultiStepLR

from torch.optim.lr_scheduler import MultiStepLR 简单来说&#xff0c;就是分阶段调整学习率&#xff0e; 用法&#xff1a; model ANet(classes5) #加载模型 optimizer optim.SGD(params model.parameters(), lr0.05) #优化方法使用SGD#在指定的epoch值&#x…

极端交换————晴问算法

文章目录 1 题目2 思路3 实现 1 题目 2 思路 以此比较最大值、最小值&#xff0c;记录最大、最小值以及其下标位置&#xff0c;结束遍历后&#xff0c;交换其位置。 3 实现 #include<iostream> using namespace std;int main(){int n;scanf("%d", &n);i…

30分钟,认识 html 本质

30分钟&#xff0c;认识 html 本质 html 是什么&#xff1f;html 起源html 发展标签分类空间占用方式布局文本修饰流媒体标签 预定义符号 Symbols弃用的部分标签学习 html html 是什么&#xff1f; HTML的英文全称是 Hyper Text Markup Language&#xff0c;即超文本标记语言。…

redismariadb + keepalived 高可用

目录 机器准备 安装后服务 redis 安装redis mariadb 安装mariadb 启动和配置 互为主从同步配置 keepalived keepalived安装 修改主从 keepalived的配置 主从配置-mariadb监控 主从配置-redis监控 查看和使用 Keepalived Mariadb redis 机器准备 两台机器&…

计算机专业套装书书单推荐

1、深度学习经典教程 深度学习动手学深度学习 “花书”与沐神大作双剑合璧&#xff0c;入门深度学习看这一套就够了&#xff0c;来自一线科学家的经验总结&#xff0c;人工智能机器学习AI算法数据科学领域的重磅作品。理论实战&#xff0c;一套书帮你get深度学习的各种知识。 …

RK3568/RK3588+LinuxCNC+Ethercat解决方案

RK3588是瑞芯微新一代旗舰级高端处理器&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6.0TOPs算力的NPU。 有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的…

IDEA、Webstorm 书签(bookmark)使用

①设置标签 ctrl shift 数字 就可以给软件设置上标签 或者 直接F11就可以添加标签 ②查看设置的标签的位置 使用shift F11 就可以标记记录的标签。

Mysql经典面试题

***搜集到的一些有用的Mysql经典《八股文》&#xff0c;全篇手打&#xff0c;大家觉得有用的话点一个赞&#xff0c;持续更新 目录 1.Mysql锁的机制&#xff1a; 粒度分类&#xff1a; 思想分类&#xff1a; 实现分类&#xff1a; 状态分类&#xff1a; 1.Mysql锁的机制&…

【雕爷学编程】Arduino动手做(130)---5A交流电流模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Jetson Orin定制载板SPI接口调试记录

1.前言 按照如下步骤操作配置SPI,但仍无法正常工作 启用spi的步骤: (1)使用jetson-io为spi1启用40pin 座子 (2)编辑dts(把TPM(slb9670)设备通过spi 连接),并使用dtc工具将dts编译为dtb。 将TPM的reg设置为0x02。 (3)设置extlinux.conf的FDT (4)reboot 应该…

多张显卡之间通信方式

显卡之间常见的通信方式有以下几种 1.broadcast&#xff08;广播&#xff09;&#xff1a;将一张卡上的数据传到其它所有的卡上&#xff08;下图中的out就是等于in&#xff09; 2. reduce&#xff08;归约&#xff09;&#xff1a;将所有显卡上的数据&#xff0c;相加/取平均/…

【AcWing】夏季每日一题2023 -- 4908. 饥饿的牛 -- Java Version

题目链接&#xff1a;https://www.acwing.com/problem/content/description/4911/ 1. 题解&#xff08;4908. 饥饿的牛&#xff09; y总视频讲解&#xff1a;https://www.acwing.com/video/4739/ 1.1 顺序遍历&#xff1a;区间计算 ⭐ 时间复杂度O(1)&#xff0c;空间复杂度O…

简单电感量测量装置电路设计

在电子制作和设计&#xff0c;经常会用到不同参数的电感线圈&#xff0c;这些线圈的电感量不像电阻那么容易测量&#xff0c;有些数字万用表虽有电感测量挡&#xff0c;但测量范围很有限。该电路以谐振方法测量电感值&#xff0c;测量下限可达 10nH&#xff0c;测量范围很宽&am…

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题

iNav开源代码之AOCODARCH7DUAL蜂鸣器持续蜂鸣问题 1. 源由2. 分析2.1 逻辑分析2.2 接线连接2.3 动态测量2.4 软件配置2.5 现象分析2.6 对比分析 3. 总结4. 参考资料 1. 源由 最近上了iNav 6.1.1固件&#xff0c;总体感觉非常不错。但是出现了一个百思不得其解的蜂鸣器持续蜂鸣…

让MBR使用硬盘

前提知识&#xff1a; BIOS中断 BIOS 和 DOS 都是存在于实模式下的程序&#xff0c;由它们建立的中断调用都是建立在中断向量表&#xff08;Interrupt Vector Table&#xff0c;IVT&#xff09;中的。它们都是通过软中断指令 int 中断号来调用的。中断向量表中第 0H&#xff…

关于30KW储能PCS逆变器的设计方案。它包括双向DCDC和三电平逆变PCS

关于30KW储能PCS逆变器的设计方案。它包括双向DCDC和三电平逆变PCS。资料中提供了仿真源码&#xff0c;其中包含并网和离网两个模型 30KW储能PCS逆变器双向变流器设计方案资料 1.此系列为30KW储能PCS逆变器设计方案资料&#xff0c;双向DCDC和三电平逆变PCS&#xff1b; 2.仿真…

使用Android Jetpack Compose构建菜单(Menu)

Android Jetpack Compose是一种现代化的声明式UI工具&#xff0c;它让构建美观且功能强大的界面变得更加简单和直观。在本文中&#xff0c;我们将介绍如何使用Jetpack Compose构建一个简单的下拉菜单。 一、什么是下拉菜单&#xff1f; 下拉菜单是一种用户界面元素&#xff0…

无迹卡尔曼滤波在目标跟踪中的作用(二)

在上一节的内容中&#xff0c;我们介绍了UKF中最重要的内容—无迹变换UT&#xff0c;今天我们将具体介绍UKF是如何实现的。 好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; UKF算法的实现 我们知道&#xff0c;我们可以使用状态方程和观测方…