Qt的事件过滤器installEventFilter

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

一、介绍

WPF中使用AddHandler来监听事件,那么QT呢?Qt的事件模型是使用一个QObject对象,来监视发送其他QObject对象的事件,在事件到达之前对其进行处理。这里要使用一个函数

void QObject::installEventFilter(QObject *filterObj)

Qt助手的解释如下:

在对象上安装一个事件过滤器filterObj。如下:

 monitoredObj->installEventFilter(filterObj);

其中monitoredObj、filterObj都是QObject的子类。上面代码意思是:在monitoredObj对象上安装一个事件过滤器filterObj。该函数一般和如下函数配合使用:

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

注意:该函数是虚函数,也就是说派生自QObject的子类可以重写该函数。

上面monitoredObj对象安装一个filterObj过滤器后,则可以在filterObj对象所在类的eventFilter函数

 class KeyPressEater : public QObject
  {
      Q_OBJECT
      ...
 
  protected:
      bool eventFilter(QObject *obj, QEvent *event) override;
  };
 
  bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
  {
      if (event->type() == QEvent::KeyPress) {
          QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
          qDebug("Ate key press %d", keyEvent->key());
          return true;
      } else {
          // standard event processing
          return QObject::eventFilter(obj, event);
      }
  }

现在我们在按钮或QListView两个窗体部件上安装过滤器,如下:

      KeyPressEater *keyPressEater = new KeyPressEater(this);
      QPushButton *pushButton = new QPushButton(this);
      QListView *listView = new QListView(this);
     
      pushButton->installEventFilter(keyPressEater);
      listView->installEventFilter(keyPressEater);

二、实例

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QLabel>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QPixmap>
#include<QMouseEvent>
#include<QImage>
namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
public:
    QLabel * label1;
    QLabel * label2;
    QLabel * label3;
    QLabel * labelstate;
    QImage image1;
    QImage image2;
    QImage image3;

private:
    Ui::Dialog *ui;
private slots:
    bool eventFilter(QObject *, QEvent *);
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

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

    label1 = new QLabel;
    label2 = new QLabel;
    label3 = new QLabel;
    labelstate = new QLabel;
    labelstate->setAlignment(Qt::AlignHCenter);

    image1.load(":/BABY.jpg");
    image2.load(":/baby.jpg");
    image3.load(":/huanhuan.jpg");

    QMatrix matrix;
    matrix.scale(0.3, 0.3);
    image1 = image1.transformed(matrix);
    image2 = image2.transformed(matrix);
    image3 = image3.transformed(matrix);

    label1->setPixmap(QPixmap::fromImage(image1));
    label2->setPixmap(QPixmap::fromImage(image2));
    label3->setPixmap(QPixmap::fromImage(image3));

    QHBoxLayout * hor = new QHBoxLayout;
    hor->addWidget(label1);
    hor->addWidget(label2);
    hor->addWidget(label3);

    QVBoxLayout * ver = new QVBoxLayout;
    ver->addLayout(hor);
    ver->addWidget(labelstate);
    setLayout(ver);

    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);



}
bool Dialog::eventFilter(QObject *watched, QEvent *event)
{
    //判断当前发生事件的对象
    if (watched == label1)
    {
        if (event->type() == QEvent::MouseButtonPress) //判断发生的事件类型
        {
            //将事件event转化为鼠标事件
            QMouseEvent * mouseEvent = (QMouseEvent *)event;
            if (mouseEvent->button()&Qt::LeftButton)
            {
                labelstate->setText(tr("Left mouse button pressed on left image"));
            }
            if (mouseEvent->button()&Qt::RightButton)
            {
                labelstate->setText(tr("middle mouse button pressed on left image"));
            }
            if (mouseEvent->button()&Qt::MidButton)
            {
                labelstate->setText(tr("right mouse button pressed on left image"));
            }
            QMatrix matrix;
            matrix.scale(2, 2);
            QImage tmp1 = image1.transformed(matrix);
            label1->setPixmap(QPixmap::fromImage(tmp1));
        }
        if (event->type() == QEvent::MouseButtonRelease)
        {
            labelstate->setText(tr("Mouse button released from left image"));
            label1->setPixmap(QPixmap::fromImage(image1));

        }
    }
    if (watched == label2)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent * mouseEvent = (QMouseEvent *)event;
            if (mouseEvent->button()&Qt::LeftButton)
            {
                labelstate->setText(tr("Left mouse button pressed on middle image"));
            }
            if (mouseEvent->button()&Qt::RightButton)
            {
                labelstate->setText(tr("middle mouse button pressed on middle image"));
            }
            if (mouseEvent->button()&Qt::MidButton)
            {
                labelstate->setText(tr("right mouse button pressed on middle image"));
            }
            QMatrix matrix;
            matrix.scale(2, 2);
            QImage  tmp2 = image2.transformed(matrix);
            label2->setPixmap(QPixmap::fromImage(tmp2));
        }
        if (event->type() == QEvent::MouseButtonRelease)
        {
            labelstate->setText(tr("Mouse button released from middle image"));
            label2->setPixmap(QPixmap::fromImage(image2));
        }

    }
    if (watched == label3)
    {
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent * mouseEvent = (QMouseEvent *)event;
            if (mouseEvent->button()&Qt::LeftButton)
            {
                labelstate->setText(tr("Left mouse button pressed on right image"));
            }
            if (mouseEvent->button()&Qt::RightButton)
            {
                labelstate->setText(tr("middle mouse button pressed on right image"));
            }
            if (mouseEvent->button()&Qt::MidButton)
            {
                labelstate->setText(tr("right mouse button pressed on right image"));
            }
            QMatrix matrix;
            matrix.scale(2, 2);
            QImage  tmp3 = image3.transformed(matrix);
            label3->setPixmap(QPixmap::fromImage(tmp3));
        }
        if (event->type() == QEvent::MouseButtonRelease)
        {
            labelstate->setText(tr("Mouse button released from right image"));
            label3->setPixmap(QPixmap::fromImage(image3));
        }
    }
    //调用QDialog::eventFilter将事件交给上层对话框
    return QDialog::eventFilter(watched, event);

}


Dialog::~Dialog()
{
    delete ui;
}

参考:

installEventFilter、eventFilter函数理解_荆楚闲人的博客-CSDN博客_installeventfilter

 QT学习之一:安装事件过滤器(installEventFilter)_隨意的風的博客-CSDN博客

 文章来源地址https://www.toymoban.com/news/detail-521336.html

 

 

 

到了这里,关于Qt的事件过滤器installEventFilter的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Qt 事件过滤器使用QPainter绘制温度

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

    2024年02月12日
    浏览(38)
  • Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

    现在有一个类似于下方图的ui,用户需要在输入前一行内容后,需要摁下指定案件能够跳转到下一行继续进行输入。 一种更为直接的解决方案是子类化 QLineEdit 并且重新实现鼠标事件 keyPressEvent() ,然后调用 focusNextChild() 。 首先需要创建一个子类MyLineEdit继承于QLineEdit类。然后重

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

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

    2024年02月08日
    浏览(51)
  • redis的安装及布隆过滤器安装

    IP mysql: 172.18.12.2 ~ 12.9 redis: 172.18.12.10 ~172.18.12.19 /usr/local/software mkdir redis mkdir 6380 /usr/local/software/redis/6380 成功结果: 成功: 可以把布隆过滤器理解为bitmap结构,判断某个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置得合理,它的精确度也可

    2024年01月21日
    浏览(39)
  • web3j的基础用法-6合约的监听器事件Event和过滤器EthFilter,以及NullPointed,调用失败导致的bug解决

    本篇以Uniswap为例(https://uniswap.org/) 合约地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni) 监听合约Tranfer事件 调用代码 核心代码实现在这里 之前实验全量区块,导致请求多次失败,是由于个人RPC节点的请求和数据有限,为了测试出结果,从13763721L block到当前,结果毫秒级返

    2024年02月11日
    浏览(50)
  • jQuery选择器(二)(基本过滤器,内容过滤器,可见过滤器)

    写在前面 jQuery是一个快速、简洁的 JavaScript 框架,是继Prototype之后又一个优秀的 JavaScript 代码库。jQuery的设计宗旨是“WriteLess,DoMore”,即倡导写更少的代码,做 更多的事情。jQuery封装了 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计模式,优化HTML文档操作、事件

    2024年02月02日
    浏览(54)
  • Gateway自定义过滤器——全局过滤器

    首先,我们要知道全局过滤器其实是特殊路由过滤器(特殊的GatewayFilter),会有条件地作用于所有路由。 为什么要自定义全局过滤器?就好比是看大门的保安大叔,平时主要是做好进出大门外来人员登记即可,但是因为新冠疫情,现在还需要给外来人员测量体温等等。而已有的

    2024年02月16日
    浏览(47)
  • 异常过滤器—MVC中异常过滤器使用

    异常过滤器( Exception Filters )是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。异常过滤器在整个应用程序范围内生效,可以用于处理各种异常情况。用于实现常见的错误处理策略,没有之前和之后事

    2024年02月13日
    浏览(60)
  • Javaweb | 过滤器、配置、过滤器链、优先级

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 概念 过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术 用户的请求和响应都需要经过过滤器 过滤器作用 执行地位在Servlet之前,客户端发送请求是,会先经过Filter,再到达目标Servlet中;响应时,会根

    2023年04月17日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包