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

这篇具有很好参考价值的文章主要介绍了Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1、需求背景

现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。
Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点,Qt,qt,c++,事件过滤器,鼠标焦点

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类。
Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点,Qt,qt,c++,事件过滤器,鼠标焦点

运行代码进行测试,效果如下:
Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点,Qt,qt,c++,事件过滤器,鼠标焦点

这种方法有一个主要的缺点:如果在窗体中使用了好几种不同类型的窗口部件(例如, 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()函数只有一个。

许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。文章来源地址https://www.toymoban.com/news/detail-517083.html

到了这里,关于Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt的事件过滤器installEventFilter

    一、介绍 WPF中使用AddHandler来监听事件,那么QT呢?Qt的事件模型是使用一个QObject对象,来监视发送其他QObject对象的事件,在事件到达之前对其进行处理。这里要使用一个函数 Qt助手的解释如下: 在对象上安装一个事件过滤器filterObj。如下: 其中monitoredObj、filterObj都是QObje

    2024年02月12日
    浏览(35)
  • Qt 事件过滤器使用QPainter绘制温度

    Qt的 eventFilter 是一个事件过滤器,可以用来捕获和处理Qt对象的事件。事件过滤器可以被安装到一个对象上,以便在该对象上拦截和处理包含特定类型和内容的事件。下面是 eventFilter 的简单使用介绍: 创建一个类,并继承自 QObject 。这个类将作为事件过滤器的实现。 在该类

    2024年02月12日
    浏览(25)
  • 【VS Code 与 Qt6】运用事件过滤器批量操作子级组件

    如果某个派生自 QObject 的类重写 eventFilter 方法,那它就成了事件过滤器(Event Filter)。该方法的声明如下: watched 参数是监听事件的对象,即事件的接收者;event 参数当然就是待处理的事件了。事件过滤器(也可以翻译为“筛选器”)可在接收者之前拦截事件,处理完毕后还

    2024年02月08日
    浏览(37)
  • 布隆过滤器讲解及基于Guava BloomFilter案例

    目录 1、布隆过滤器是什么 2、主要作用 3、存储过程 4、查询过程 5、布隆过滤器的删除操作 6、优点 7、缺点 8、测试误判案例 8.1、引入Guava依赖 8.2、编写测试代码 8.3、测试 8.4、BloomFilter实现原理  9、总结 推荐博主视频,讲的很棒:布隆过滤器详解         布隆过滤器(

    2023年04月09日
    浏览(25)
  • Django基础入门⑥:Django过滤器和标签讲解

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 Django过滤器是

    2024年02月11日
    浏览(27)
  • 操作过滤器—MVC中使用操作过滤器实现JWT权限认证

    上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。 ​ 与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行

    2024年02月13日
    浏览(32)
  • spring boot过滤器实现项目内接口过滤

    由于业务需求,存在两套项目,一套是路由中心,一套是业务系统. 现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务. 现在需要通过调用路由中心将接口重新路由到指定的业务系统中 将小程序,公众号用户信息与业务系统做绑定 将路由中心的

    2023年04月20日
    浏览(35)
  • Java实现布隆过滤器

    背景: 为预防大量黑客故意发起非法的时间查询请求,造成缓存击穿,建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数(哈希函数)来记录与识别某个数据是否在一个集合中。如果数据不在集合中,能被识别出来,不需要到数据

    2024年02月01日
    浏览(35)
  • 资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

    上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,操作过滤器—MVC中使用操作过滤器实现JWT权限认证,接下来将简单的谈谈资源过滤器在MVC中如何

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包