三十一、事件过滤处理分析

三十一、事件过滤处理分析eventFilter

实现以下功能

bool QObject::eventFilter(QObject *watched, QEvent *event):

如果已将此对象安装为所监视对象的事件过滤器,则过滤事件。
在你重新实现这个函数时,如果你想过滤掉事件,即停止它被进一步处理,返回true;否则返回false。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include<QLabel>
#include<QImage>
#include<QPixmap>
#include<QMouseEvent>
#include<QEvent>
#include<QBoxLayout>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QLabel *label1;
    QLabel *label2;
    QLabel *label3;

    QLabel *labelDispInfo;

    QImage image1;
    QImage image2;
    QImage image3;

public slots:
    bool eventFilter(QObject *,QEvent *);
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

// MainWindow的构造函数,接收一个QWidget类型的父对象
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)   // 调用基类QMainWindow的构造函数,传递父对象
    , ui(new Ui::MainWindow)  // 初始化用户界面对象
{
    ui->setupUi(this);       // 使用用户界面对象来设置和初始化主窗口
    resize(800,500);          // 设置主窗口的初始大小为800x500像素

    // 创建一个新的QLabel对象,用于显示图片
    label1=new QLabel;
    // 从指定路径加载图片,并将其缩放到100x100像素
    QImage image_1("E:/blog/source/img/wallhaven-9m92rx.jpg");
    image1=image_1.scaled(100,100);
    // 设置标签的对齐方式,水平和垂直居中
    label1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    // 将缩放后的图片设置为标签的Pixmap
    label1->setPixmap(QPixmap::fromImage(image1));

    // 创建第二个QLabel对象,加载和缩放图片,并设置对齐方式
    label2=new QLabel;
    QImage image_2("E:/blog/source/img/wallhaven-p2m2ke.jpg");
    image2=image_2.scaled(100,100);
    label2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label2->setPixmap(QPixmap::fromImage(image2));

    // 创建第三个QLabel对象,加载和缩放图片,并设置对齐方式
    label3=new QLabel;
    QImage image_3("E:/blog/source/img/wallhaven-xlv55l.png");
    image3=image_3.scaled(100,100);
    label3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label3->setPixmap(QPixmap::fromImage(image3));

    // 创建显示鼠标按键提示信息的QLabel对象,并设置对齐方式
    labelDispInfo=new QLabel("鼠标按键提示信息!");
    labelDispInfo->setAlignment(Qt::AlignHCenter);

    // 创建一个水平布局,并添加前面创建的三个标签
    QHBoxLayout *hbl=new QHBoxLayout;
    hbl->addWidget(label1);
    hbl->addWidget(label2);
    hbl->addWidget(label3);

    // 创建一个新的QWidget对象,作为中间的容器,并设置垂直布局
    QWidget *wid=new QWidget(this);
    QVBoxLayout *vbl=new QVBoxLayout(wid);
    vbl->addLayout(hbl);   // 将水平布局添加到垂直布局中
    vbl->addWidget(labelDispInfo);  // 将鼠标按键提示信息的标签添加到垂直布局中

    // 设置主窗口的中心部件为刚刚创建的容器部件
    setCentralWidget(wid);

    // 为每个标签安装事件过滤器,以便在鼠标事件发生时能够响应和处理
    label1->installEventFilter(this);
    label2->installEventFilter(this);
    label3->installEventFilter(this);
}

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

bool MainWindow::eventFilter(QObject *watched,QEvent *event)
{
    // 检查事件的目标对象是否是label1
    if(watched == label1)
    {
        // 如果事件类型是鼠标按键按下
        if(event->type() == QEvent::MouseButtonPress)
        {
            // 将事件转换为鼠标事件对象
            QMouseEvent *mouse = (QMouseEvent*)event;

            // 检查按下的鼠标按键是左键、中键还是右键
            if(mouse->button() & Qt::LeftButton)
            {
                // 如果按下的是左键,设置label1的文本为"鼠标左键被按下:左边图片"
                label1->setText("鼠标左键被按下:左边图片");
            }
            else if(mouse->button() & Qt::MidButton)
            {
                // 如果按下的是中键,设置label1的文本为"鼠标中键被按下:左边图片"
                label1->setText("鼠标中键被按下:左边图片");
            }
            else if(mouse->button() & Qt::RightButton)
            {
                // 如果按下的是右键,设置label1的文本为"鼠标右键被按下:左边图片"
                label1->setText("鼠标右键被按下:左边图片");
            }

            // 创建一个矩阵对象,并对其进行缩放操作(2x2)
            QMatrix matrix;
            matrix.scale(2,2);

            // 将image1进行变换后存储到临时图像对象tempImage中
            QImage tempImage = image1.transformed(matrix);
        }

        // 如果事件类型是鼠标按键释放
        if(event->type() == QEvent::MouseButtonRelease)
        {
            // 设置label1的文本为"鼠标按键已经释放"
            labelDispInfo->setText("鼠标按键已经释放");

            // 将image1设置为label1的pixmap,即将原始图片显示在label1上
            label1->setPixmap(QPixmap::fromImage(image1));
        }
    }

    else if(watched==label2)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent *mouse=(QMouseEvent*)event;
            if(mouse->button()&Qt::LeftButton)
            {
                label2->setText("鼠标左键被按下:中间图片");
            }
            else if(mouse->button()&Qt::MidButton)
            {
                label2->setText("鼠标中键被按下:中间图片");
            }
            else if(mouse->button()&Qt::RightButton)
            {
                label2->setText("鼠标右键被按下:中间图片");
            }

            QMatrix matrix;
            matrix.scale(2.5,2.5);
            QImage tempImage=image2.transformed(matrix);
        }

        if(event->type()==QEvent::MouseButtonRelease)
        {
            labelDispInfo->setText("鼠标按键已经释放");
            label2->setPixmap(QPixmap::fromImage(image2));
        }
    }

    else if(watched==label3)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent *mouse=(QMouseEvent*)event;
            if(mouse->button()&Qt::LeftButton)
            {
                label3->setText("鼠标左键被按下:右边图片");
            }
            else if(mouse->button()&Qt::MidButton)
            {
                label3->setText("鼠标中键被按下:右边图片");
            }
            else if(mouse->button()&Qt::RightButton)
            {
                label3->setText("鼠标右键被按下:右边图片");
            }

            QMatrix matrix;
            matrix.scale(3,3);
            QImage tempImage=image3.transformed(matrix);
        }

        if(event->type()==QEvent::MouseButtonRelease)
        {
            labelDispInfo->setText("鼠标按键已经释放");
            label3->setPixmap(QPixmap::fromImage(image3));
        }
    }

    // 调用基类的eventFilter函数作为最后的处理手段
    return QMainWindow::eventFilter(watched,event);
}

这段代码是一个使用Qt库编写的C++程序,主要功能是创建一个主窗口,并在其中添加了三个标签(QLabel),每个标签都显示一张图片。同时,程序还为每个标签添加了鼠标按键事件过滤器,以便在鼠标按键按下或释放时执行相应的操作。

下面是代码的详细解释:

  1. #include "mainwindow.h" 和 #include "ui_mainwindow.h" 这两行代码分别包含了主窗口的头文件和用户界面对象的头文件。
  2. MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) 这是主窗口的构造函数,它接收一个QWidget类型的父对象。它调用基类QMainWindow的构造函数,并将父对象传递给它。同时,它初始化用户界面对象。
  3. 在构造函数中,程序首先设置了主窗口的初始大小为800x500像素。
  4. 然后,程序创建了三个QLabel对象(label1、label2和label3),用于显示图片。
  5. 程序从指定路径加载三张图片,并将它们缩放到100x100像素。
  6. 程序将缩放后的图片设置为每个标签的Pixmap。
  7. 接下来,程序创建了一个用于显示鼠标按键提示信息的QLabel对象(labelDispInfo)。
  8. 程序创建了一个水平布局(QHBoxLayout),并将前面创建的三个标签添加到该布局中。
  9. 程序创建了一个新的QWidget对象,作为中间的容器,并设置垂直布局(QVBoxLayout)。
  10. 程序将水平布局添加到垂直布局中,并将垂直布局设置为主窗口的中心部件。
  11. 程序为每个标签安装事件过滤器,以便在鼠标事件发生时能够响应和处理。
  12. MainWindow::~MainWindow()析构函数中,程序删除了用户界面对象。
  13. bool MainWindow::eventFilter(QObject *watched,QEvent *event)函数中,程序实现了鼠标按键事件的过滤和处理。它检查事件的目标对象是否是label1、label2或label3,并根据鼠标按键的类型执行相应的操作。例如,如果按下的是左键,它会设置label1的文本为"鼠标左键被按下:左边图片"。如果释放的是鼠标按键,它会设置labelDispInfo的文本为"鼠标按键已经释放",并将原始图片显示在相应的标签上。

QImage QImage::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const:

void QObject::installEventFilter(QObject *filterObj):

在此对象上安装事件过滤器filterObj。

QImage QImage::transformed(const QMatrix &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const:

返回使用给定的转换矩阵和转换模式进行转换的图像的副本。

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

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

相关文章

C++ QT中Q_Q和Q_D是什么?怎么使用?本质是什么?C++仿写

1.QT中Q_Q和Q_D是什么&#xff1f; Q_Q可以得到外部可以访问的类指针Q_D可以得到内部封装&#xff0c;外部不可达的类指针 2. 怎么使用&#xff1f; 上代码 APrivate.h #pragma once #include <QtCore>class A;class APrivate {Q_DECLARE_PUBLIC(A) public:APrivate(…

三种文本相似计算方法:规则、向量与大模型裁判

文本相似计算 项目背景 目前有众多工作需要评估字符串之间的相似(相关)程度&#xff1a;  比如&#xff0c;RAG 智能问答系统文本召回阶段需要计算用户文本与文本库内文本的相似分数&#xff0c;返回前TopK个候选文本。  在评估大模型生成的文本阶段&#xff0c;也需要评估…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐&#xff0c;但如何将其转换为易于分享和打印的 PDF 格式&#xff0c;是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法&#xff0c;并探讨…

浅谈云计算21 | Docker容器技术

Docker容器技术 一、 容器技术特性1.1 轻量级特性1.2 隔离性特性 二、容器镜像2.1 容器镜像概述2.1.1 定义与构成2.1.2 分层结构 2.2 联合文件系统2.3 容器镜像的构建与管理2.3.1 容器镜像的构建2.3.2 **构建镜像流程**2.3.3 **应用场景**2.3.4 镜像仓库的应用 2.4 容器镜像的优…

LabVIEW实现油浸式变压器自主监测与实时报告

油浸式变压器广泛应用于电力系统中&#xff0c;尤其是在电力传输和分配领域。为了确保变压器的安全、稳定运行&#xff0c;及时监测其工作状态至关重要。传统的变压器监测方法通常依赖人工巡检和定期检查&#xff0c;但这不能及时发现潜在的故障隐患&#xff0c;且效率较低。随…

【2025最新】国内中文版 ChatGPT镜像网站整理合集,GPT最新模型4o1,4o,4o-mini分类区别,镜像站是什么

1.快速导航 原生中转型镜像站点 立即Chat支持GPT4、4o以及o1,canvs等&#xff0c;同步官网功能 AIChat.com 支持最新4O 2.两者对比 官网立即Chat访问难度需要魔法直接访问支付手段国际支付国内支付封禁策略检测节点&#xff0c;随时封禁不会封禁价格每月140元订阅费用每年70元…

SpringBoot:RestTemplate与IllegalArgumentException

问题描述 在SpringBoot应用中&#xff0c;有时会遇到使用RestTemplate调用第三方服务的场景。例如&#xff1a;在进行地名数据采集时&#xff0c;为了拿到地名对应的经纬度位置&#xff0c;通常会有地理编码的步骤&#xff0c;此时就可能涉及到调用第三方接口服务实现此需求。 …

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…

基于预共享密钥的IPsec实验

一、实验目的 &#xff08;1&#xff09;了解IPsec的原理和协议运行机制&#xff1b; &#xff08;2&#xff09;掌握IPsec身份认证的预共享密钥的配置&#xff1b; &#xff08;3&#xff09;掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成&#xff08;F1&#xff09; FLASH读写过程&#xff08;F1&#xff09; 闪存的读取 闪存的写入 内部FLASH构成&#xff08;F4 / F7 / H7&#xff09; FLASH读写过程&#xff08;F4 / F7 / H7&#xff09; 闪存的读取 闪存的写入 …

Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量

随着工业4.0时代的到来&#xff0c;自动化和智能化成为制造业的趋势。机器人作为实现这一趋势的重要工具&#xff0c;其性能和智能水平直接影响到生产效率和产品质量。然而&#xff0c;传统的机器人系统在应对复杂任务时往往缺乏足够的灵活性和适应性。为了解决这一问题&#x…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

电子画册制作平台哪个好?

​作为一个热爱分享的人&#xff0c;我试过了好几个平台&#xff0c;终于找到了几款比较好用得电子杂志制作平台&#xff0c;都是操作界面很简洁&#xff0c;上手非常快的工具。 FLBOOK:这是一款在线制作H5电子画册软件&#xff0c;提供了各种类型的模板&#xff0c;可支持添加…

如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?

Google Cloud Shell 是一个基于浏览器的命令行界面&#xff0c;它提供了一个临时的虚拟机环境&#xff0c;允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…

anaconda安装和环境配置

文章目录 一、Anaconda下载1.从官网直接下载&#xff1a;2.从镜像站中下载&#xff1a; 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境&#xff08;方便管理项目环境&#xff09;1.查看conda有哪些环境2.创建python3.6的环境3.激活…

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度&#xff0c;试问是否能够跳出这个长度&#xff08;即落点位置在0或n1&#xff09; 思路分析 输入n就有n个房间&#xff0c;n套规则&#xff08;固定方向和跳跃距离&#xff09;&#xff0c;蚂蚱到哪个房间就…

css 实现自定义虚线

需求&#xff1a; ui 画的图是虚线&#xff0c;但是虚线很宽正常的border 参数无法做到 进程&#xff1a; 尝试使用 border&#xff1a;1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单&#xff0c;让ui 画一个图然…