<QT基础(5)>事件监听

news2024/9/23 15:24:27

事件监听

事件监听(Event Handling)是在程序中监视和响应发生的事件的一种机制。在Qt中,事件监听是一种常见的用于处理用户输入、系统事件以及其他类型事件的方法。通过事件监听,您可以在发生特定事件时捕获事件并执行相应的操作,而无需手动轮询或定期检查事件的状态。

在Qt中,事件监听可以通过以下几种方式实现:

  1. 重写事件处理函数: 可以重写 Qt 对象的事件处理函数,例如 QWidgetQMainWindow 等的事件处理函数,以处理特定类型的事件。例如,QWidget 有一个名为 event() 的虚函数,允许您处理各种类型的事件,包括键盘事件、鼠标事件、绘图事件等。
  2. 安装事件过滤器: 可以为一个对象安装事件过滤器,从而拦截并处理该对象接收到的所有事件。通过重写事件过滤器的 eventFilter() 函数,您可以对特定类型的事件进行处理。事件过滤器允许您在一个地方集中处理多个对象的事件,而不必修改每个对象的代码。

事件监听的作用包括但不限于:

  • 用户交互: 通过监听用户的鼠标点击、键盘输入等事件,可以实现用户界面的交互功能,例如按钮点击、文本输入、拖放操作等。
  • 状态更新: 监听特定的系统或对象状态变化事件,可以及时更新应用程序的状态,例如窗口大小变化、文件加载完成等。
  • 自定义行为: 通过捕获和处理特定的事件,可以实现应用程序的自定义行为和交互逻辑,例如拦截并处理特定的键盘快捷键、过滤用户输入等。
  • 错误处理: 可以通过监听并处理异常、错误等事件,实现应用程序的错误处理和异常恢复机制。

总之,事件监听是 Qt 中实现用户交互、状态更新、自定义行为和错误处理等功能的重要机制,它使得开发者能够更加灵活和高效地处理各种类型的事件。

在前述预览窗口中指定需要显示的序列图像,使用eventFilter()重载对预览窗口的QLabel的MouseButtonRelease()Event做出对应的反应,包括:

  • 将主窗口要显示的图像索引设置为当前QLabel的索引
  • 解除前一个QLabel的选中状态,将当前QLabel设置为选中状态

为QLabel和scrollableWidget设置事件监听

ScrollableWidget* scrollableWidget = new  ScrollableWidget(l_num);
scrollableWidget->installEventFilter(scrollableWidget);
label->installEventFilter(this);

eventFilter重载

private:
    vector<QLabel*> PreWinLst;
    vector<QWidget*> PreWinLst_Wid;
 	int Current_mainWin_Srs_Idx = 0;
   //此时QLabel指向ScrollableWidget的子控件,
    //子控件直接随着ScrollableWidget析构释放了,不需要额外释放QLabel指针指向的内存
    //PreWinLst内部管理的内存由vector析构函数释放
public:
 bool eventFilter(QObject* obj, QEvent* event) override {
        for (int i = 0; i < PreWinLst.size(); i++)
        {
            if (obj == PreWinLst[i] && event->type() == QEvent::MouseButtonRelease)
            {
                PreWinLst[Current_mainWin_Srs_Idx]->setStyleSheet("border-color: rgb(255, 255, 255);");
                Current_mainWin_Srs_Idx = i;
                PreWinLst[Current_mainWin_Srs_Idx]->setStyleSheet("border-style: solid;border-width: 5px;border-color: rgb(10, 100, 160);");
                return true;
            
            }
        }
        return false;
    }

代码及结果

#pragma once

#include <QtWidgets/QMainWindow>
#include <QtWidgets>
#include "ui_dcmimgpro.h"

using namespace std;

class DcmImgPro : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::DcmImgProClass ui;
private slots:
    void pushbtn();
    void lineEditset();
private:
    int l_num = 15;
};

class ScrollableWidget:public QWidget
{
public:
    ScrollableWidget(int numWidgets)
    {
        QVBoxLayout* layout = new QVBoxLayout(this);
        for (int i = 0; i < numWidgets; i++)
        {
            QWidget* widget = new QWidget;
            widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
            widget->setMinimumSize(QSize(200, 200));
          

            QLabel* label = new QLabel;
            label->setGeometry(QRect(0, 0, widget->width(), widget->height()));//全屏铺满
            label->setMinimumSize(QSize(180, 180));
            label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);

            // 创建一个渐变对象,并设置渐变色
            QLinearGradient gradient(0, 0, 200, 200); // 从左到右的线性渐变
            gradient.setColorAt(0, Qt::red);
            gradient.setColorAt(0.5, Qt::green);
            gradient.setColorAt(1, Qt::blue);

            // 创建一个QPixmap,并使用渐变填充
            QPixmap pixmap(200, 200);
            pixmap.fill(Qt::transparent); // 填充透明背景
            QPainter painter(&pixmap);
            painter.fillRect(pixmap.rect(), gradient);

            label->setPixmap(pixmap);
            label->installEventFilter(this);

            QVBoxLayout* widgetlayout = new QVBoxLayout(widget);
            widgetlayout->addWidget(label);
            layout->addWidget(widget);

            PreWinLst.push_back(label);
            PreWinLst_Wid.push_back(widget);
        }
    }

    bool eventFilter(QObject* obj, QEvent* event) override {
        for (int i = 0; i < PreWinLst.size(); i++)
        {
            if (obj == PreWinLst[i] && event->type() == QEvent::MouseButtonRelease)
            {

                PreWinLst[Current_mainWin_Srs_Idx]->setStyleSheet("border-color: rgb(255, 255, 255);");
                Current_mainWin_Srs_Idx = i;
                PreWinLst[Current_mainWin_Srs_Idx]->setStyleSheet("border-style: solid;border-width: 5px;border-color: rgb(10, 100, 160);");
                return true;
            
            }
        }
        return false;
    }

private:
    vector<QLabel*> PreWinLst;
    vector<QWidget*> PreWinLst_Wid;
    int Current_mainWin_Srs_Idx = 0;

    //此时QLabel指向ScrollableWidget的子控件,
    //子控件直接随着ScrollableWidget析构释放了,不需要额外释放QLabel指针指向的内存
    //PreWinLst内部管理的内存由vector析构函数释放


};
#include "dcmimgpro.h"

DcmImgPro::DcmImgPro(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    ui.scrollArea->setWidgetResizable(true);
    ScrollableWidget* scrollableWidget = new  ScrollableWidget(l_num);
    scrollableWidget->installEventFilter(scrollableWidget);

    ui.scrollArea->setWidget(scrollableWidget);
    ui.lineEdit->setText(QString::number(l_num));
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(pushbtn()));
    connect(ui.lineEdit, SIGNAL(editingFinished()), this, SLOT(lineEditset()));
    //textChanged   cursorPositionChanged
    //editingFinished  selectionChanged returnPressed() 
}

void DcmImgPro::pushbtn()
{
    ui.scrollArea->setWidget(nullptr);
    ScrollableWidget* scrollableWidget = new  ScrollableWidget(l_num);
    ui.scrollArea->setWidget(scrollableWidget);
}

void DcmImgPro::lineEditset()
{
    l_num = ui.lineEdit->text().toInt();
}
DcmImgPro::~DcmImgPro()
{
 
}

在这里插入图片描述

ChatGPT生成的代码解析

这段代码定义了两个类:DcmImgProScrollableWidget

  1. DcmImgPro 类
    • DcmImgPro 类是一个继承自 QMainWindow 的类,它具有一个构造函数和一个析构函数。构造函数中使用了一个名为 ui 的私有成员对象,该对象是通过 UI 设计工具(如 Qt Designer)生成的界面类的实例。构造函数还初始化了一个名为 l_num 的私有成员变量,并赋值为 15。
    • 类中声明了两个私有槽函数 pushbtn()lineEditset(),这些槽函数可以与界面中的按钮、文本框等控件的信号关联起来,以实现对应的功能。
  2. ScrollableWidget 类
    • ScrollableWidget 类是一个自定义的 QWidget 子类,用于创建可滚动的窗口。它接受一个整数参数 numWidgets,用于指定需要创建的子控件(QLabel)的数量。
    • 在构造函数中,使用循环创建了指定数量的 QWidget 和 QLabel 控件,并将它们添加到垂直布局中。每个 QLabel 控件都包含一个渐变的 QPixmap,用于填充其背景。此外,每个 QLabel 控件还安装了事件过滤器,以便捕获鼠标释放事件。
    • 在事件过滤器中,当捕获到鼠标释放事件时,首先清除当前被选中 QLabel 的边框颜色,然后更新当前被选中 QLabel 的索引,并为其设置新的边框样式。

总的来说,DcmImgPro 类是一个主窗口类,用于创建应用程序的主界面,并处理界面上的按钮点击等事件;ScrollableWidget 类是一个自定义的可滚动窗口部件,用于创建一个包含多个 QLabel 的可滚动区域,每个 QLabel 带有渐变背景和边框样式,并可以捕获鼠标释放事件以实现选中效果。

其中ScrollableWidget 类是一个自定义的 QWidget 子类,它的主要功能是创建一个可滚动的窗口,并在其中放置多个带有渐变背景的 QLabel 控件。下面是对 ScrollableWidget 类的详细解释:

  1. 构造函数
    • ScrollableWidget 类的构造函数接受一个整数参数 numWidgets,用于指定要创建的子控件(QLabel)的数量。
    • 在构造函数中,首先创建了一个垂直布局管理器 QVBoxLayout,并将其设置为 ScrollableWidget 的布局管理器,以便放置子控件。
    • 然后使用一个循环,根据参数 numWidgets 的值,创建了指定数量的 QWidget 和 QLabel 控件,并将它们添加到垂直布局中。
  2. 创建子控件
    • 在循环中,首先创建了一个 QWidget 控件,用于容纳一个 QLabel 控件。
    • 对每个 QWidget 控件进行了一些设置,包括设置其大小策略为固定大小,并设置其最小大小为 (200, 200) 像素。
    • 然后创建了一个 QLabel 控件,并设置了它的对齐方式为居中对齐。
  3. 设置渐变背景
    • 在每个 QLabel 控件中,使用 QLinearGradient 创建了一个线性渐变对象,并设置了渐变的起始和结束颜色。
    • 创建一个与 QLabel 控件相同大小的 QPixmap,并使用渐变对象填充该 QPixmap。
    • 最后,将该 QPixmap 设置为 QLabel 控件的背景。
  4. 安装事件过滤器
    • 对每个 QLabel 控件调用了 installEventFilter(this),将 ScrollableWidget 自身作为事件过滤器。这意味着 ScrollableWidget 类会监听每个 QLabel 控件的事件。
  5. 事件过滤器
    • 重写了 eventFilter 函数,在该函数中捕获了鼠标释放事件。
    • 当鼠标释放事件发生时,首先清除了当前被选中 QLabel 控件的边框颜色,然后更新了当前被选中 QLabel 控件的索引,并为其设置了新的边框样式。

总的来说,ScrollableWidget 类是一个用于创建带有渐变背景的可滚动窗口部件,其中包含多个 QLabel 控件。它允许用户点击任意 QLabel 控件,并在其周围绘制一个特定样式的边框以指示选中状态。

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

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

相关文章

HarmonyOS 应用开发之Want的定义与用途

Want 是一种对象&#xff0c;用于在应用组件之间传递信息。 其中&#xff0c;一种常见的使用场景是作为 startAbility() 方法的参数。例如&#xff0c;当UIAbilityA需要启动UIAbilityB并向UIAbilityB传递一些数据时&#xff0c;可以使用Want作为一个载体&#xff0c;将数据传递…

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客&#xff1a;https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则&#xff0c;这组规则定义了数据对象在 vSAN 存储上是如何保存的&#xff0c;存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…

解码“零信任”,如何带来信任感?

零信任的“信任”来源&#xff0c;并非凭空而生&#xff0c;而是建立在严格、细致且持续的验证、策略之上。它不仅能够提升企业的安全防护能力&#xff0c;也在加速安全技术的创新与演进。 推动创新 零信任理念激活网络安全 身份和访问管理革新。零信任理念“永不信任&#…

Jenkins升级中的小问题

文章目录 使用固定版本安装根据jenkins页面下载war包升级jenkins重启jenkins报错问题解决 K8s部署过程中的一些小问题 ##### Jenkins版本小插曲 ​ 在Jenkins环境进行插件安装时全部清一色飘红&#xff0c;发现是因为Jenkins版本过低导致&#xff0c;报错的位置可以找到更新je…

【InternLM 实战营第二期笔记】书生·浦语大模型全链路开源体系及InternLM2技术报告笔记

大模型 大模型成为发展通用人工智能的重要途径 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型开源历程 2023.6.7&#xff1a;InternLM千亿参数语言大模型发布 2023.7.6&#…

【React】onClick点击事件传参的4种方式

记录React onClick 点击事件传参的 4 种方式 方式一&#xff1a;使用内联箭头函数 import React, { MouseEvent } from "react";function App() {const handleClick (event: MouseEvent<HTMLButtonElement>, name: string) > {console.log(event)console.…

Unity图集编辑器

图集编辑器 欢迎使用图集编辑器新的改变编辑器图片 欢迎使用图集编辑器 Unity图集操作很是费劲 无法批量删除和添加图集中的图片 新的改变 自己写了一个图集编辑器 客&#xff1a; 支持批量删除 左键点击图片代表选中 右键点击图标定位到资产支持批量添加 选中图片拖拽到编…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…

非wpf应用程序项目【类库、用户控件库】中使用HandyControl

文章速览 前言参考文章实现方法1、添加HandyControl包&#xff1b;2、添加资源字典3、修改资源字典内容 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 前言 wpf应用程序中&#xff0c;在入口项目中…

单例模式如何保证实例的唯一性

前言 什么是单例模式 指一个类只有一个实例&#xff0c;且该类能自行创建这个实例的一种创建型设计模式。使用目的&#xff1a;确保在整个系统中只能出现类的一个实例&#xff0c;即一个类只有一个对象。对于频繁使用的对象&#xff0c;“忽略”创建时的开销。特点&#xff1a…

arp 协议

数据链路层 我们之前学习到的 IP 协议解决的是数据跨网络传输的问题。 数据链路层解决的是&#xff1a;直接相连的主机&#xff0c;进行数据交付的问题&#xff01; 直接相连的设备包括我们的电脑&#xff0c;路由器等等哈&#xff01; 我们在网络基础那篇文章中讲过什么是以…

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D&#xff08;包括UI&#xff09;、射线与ScreenPointToRay 2.3D&#xff08;包括UI&#xff09;、射线与ScreenToWorldPoint …

基于单片机锂电池电量检测数码管显示系统设计

**单片机设计介绍&#xff0c;基于单片机锂电池电量检测数码管显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机锂电池电量检测数码管显示系统设计的主要目标是实时、准确地检测锂电池的电量&#xff0c;并…

如何利用webpack来优化前端性能

当涉及前端性能优化时&#xff0c;Webpack 是一款不可或缺的工具。它不仅仅是一个模块打包工具&#xff0c;还提供了各种功能和插件&#xff0c;可以帮助开发人员优化前端应用程序的性能。在这篇文章中&#xff0c;我们将深入探讨如何有效地利用 Webpack 来优化前端性能&#x…

「15」色源:添加指定色彩的纯色画面素材

「15」色源添加指定色彩的纯色画面素材 在OBS软件里&#xff0c;在来源里可以增加色源&#xff0c;添加一个色块到您的场景中&#xff0c;作为一个背景色或辅助色。 图中的显示器就是加了色源的 实操步骤 第1步 添加色源 在「来源」的左下角&#xff0c;点「」选择「色源」&a…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…

「DevExpress中文教程」如何将DevExtreme JS HTML编辑器集成到WinForms应用

在本文中我们将演示一个混合实现&#xff1a;如何将web UI工具集成到WinForms桌面应用程序中。具体来说&#xff0c;我们将把DevExtreme JavaScript WYSIWYG HTML编辑器(作为DevExtreme UI组件套件的一部分发布的组件)集成到Windows Forms应用程序中。 获取DevExtreme v23.2正式…

Kafka重要配置参数全面解读(重要)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Kafka重要配置参数全面解读(重要 前言auto.create.topics.enableauto.leader.rebalance.enablelog.retention.{hour|minutes|ms}offsets.topic.num.partitions 和 offsets.topic.replication.factorlo…

Excel:使用VLOOKUP函数,抓取指定数据,后一个列

Excel:使用VLOOKUP函数&#xff0c;抓取指定数据&#xff0c;后一个列 我们有这样一个数据源 要是实现这个页面的赋值 就是对应关系映射 使用 VLOOKUP(A2,Sheet2!$A$2:$B$9,2,FALSE)第一个参数是需要匹配的单元格。 第二个参数是数据源&#xff0c;我这里数据源用的是shee…

[Flutter]环境判断

方式一&#xff08;推荐&#xff09; 常量kReleaseMode&#xff0c;它会根据你的应用是以什么模式编译的来获取值。bool.fromEnvironment会从Dart编译时的环境变量中获取值。对于dart.vm.product这个特定的环境变量&#xff0c;它是由Dart VM设置的&#xff0c;用来标明当前是…