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

事件监听

事件监听(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 控件,并在其周围绘制一个特定样式的边框以指示选中状态。

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

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

相关文章

Ainx的多路由模式

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

使用Zabbix监控NAS目录状态

在企业的数据存储和共享中,网络附加存储(NAS)扮演着至关重要的角色。为了确保NAS设备的稳定运行和数据的完整性,对其进行实时监控是必不可少的。Zabbix作为一款开源的网络监控解决方案,能够帮助我们实现这一目标。本文将介绍如何使用Zabbix监控NAS目录状态,以确保及时发现…

如何在CentOS使用Docker搭建MinIO容器并实现无公网ip远程访问本地服务

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

MySQL数据库 - 复杂查询(一)

一个不知名大学生&#xff0c;江湖人称菜狗 original author: Jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2024.03.27 Last edited: 2024.03.27 目录 MySQL数据库 - 复杂查询&#xff08;一&#xff09; 第1关&#xff1a;交换工资 任务描述 相关知…

电平输入检测-定时器输入捕获

目录 一&#xff0c;引入 二&#xff0c;具体结构 三&#xff0c;实现步骤 四&#xff0c;PWM输入模式 一&#xff0c;引入 上篇博客&#xff0c;我们对于定时器的计数核心——时基单元作了细致的了解。这篇博文&#xff0c;我们来介绍定时器的四大功能模块之一——输入捕获…

Python基本运算

1.逻辑运算符 第四行会有黄色的下划线是因为这个不是系统推荐的写法&#xff0c;系统推荐的是第五行的链式比较&#xff1b; 2.短路求值 对于and而言&#xff0c;左边的语句是false&#xff0c;那么整体一定是false,右边的表达式就不会进行计算&#xff1b; 对于or而言&…

ChatGLM3:AttributeError_ can‘t set attribute ‘eos_token‘

最近在微调 ChatGLM3-6b 时&#xff0c;训练好模型之后&#xff0c;调用inference_hf.py函数验证模型的时候报了如下错误&#xff0c;下面是解决方案。 我在训练时使用的是ptuning_v2.yaml配置文件&#xff0c;训练运行代码如下&#xff1a; CUDA_VISIBLE_DEVICES1 python fi…

C++取经之路(其二)——含数重载,引用。

含数重载: 函数重载是指&#xff1a;在c中&#xff0c;在同一作用域&#xff0c;函数名相同&#xff0c;形参列表不相同(参数个数&#xff0c;或类型&#xff0c;或顺序)不同&#xff0c;C语言不支持。 举几个例子&#xff1a; 1.参数类型不同 int Add(int left, int right)…

智慧酒店(一):EasyCVR酒店安防视频监控系统的搭建与特点分析

一、行业背景 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;智慧酒店作为现代酒店业的重要发展方向&#xff0c;人工智能的应用显得尤为重要。数据显示&#xff0c;全国智慧酒店每年以10%—15%的速度快速增长&a…

大型DMP系统

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这是我作为学习笔记总结应用篇第一篇&#xff0c;本章大量的参考了别的博主的文章。 我们今天就先从搭建一个大型的 DMP 系统开始&#xff0c;利用组成原理里面学到的存储器知识&#xff0c;来做选型判断&#xff0c;从而更…

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库&#xff0c;也是一种NoSQL数据库。 它支持多种数据类型&#xff0c;包括String、Map、Set、ZSet和List&#xff0c;以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础&#xff0c;提…

短视频矩阵系统--技术3年源头迭代

短视频矩阵系统核心技术算法主要包括以下几个方面&#xff1a; 1. 视频剪辑&#xff1a;通过剪辑工具或API从各大短视频平台抓取符合要求的视频。这些视频通常符合某些特定条件&#xff0c;如特定关键词、特定时间段发布的视频、视频点赞评论转发等数据表现良好的视频。 2. 视…

揭露非法集资陷阱!

常见的非法集资手法 犯罪分子利用了社会公众的哪些心理&#xff1f; 使用了怎样的措辞&#xff1f; 一起来揭露非法资金集聚的几个陷阱&#xff01; 拐弯抹角地向亲朋好友承诺大额回报&#xff0c;希望他们加入&#xff08;利用社会认同原则&#xff09;。 不法分子造了个传…

pygame用chatgpt绘制3d沿x轴旋转的

import pygame from pygame.locals import * import sys import mathpygame.init()width, height 800, 600 screen pygame.display.set_mode((width, height))vertices [(0, 100, 0), (100, 200, 0), (300, 100, 0)]angle 0 rotation_speed 2 # 可根据需要调整旋转速度 c…

UDP send 出现大量“Resource temporarily unavailable”

背景 最近排查用户现场环境&#xff0c;查看日志出现大量的“send: Resource temporarily unavailable”错误&#xff0c;UDP设置NO_BLOCK模式&#xff0c;send又发生在进程上下文&#xff0c;并且还设置了SO_SNDBUF 为8M&#xff0c;在此情况下为什么还会出现发送队列满的情况…

iOS —— 初识KVO

iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项&#xff1a; KVO的基础 1. KVO概念 KVO是一种开发模式&#xff0c;它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…

蓝桥备赛——DFS

废话不多说&#xff0c;先上题 对应代码如下&#xff1a; def dfs(x,y):global numfor i in range(0,4):dir[(-1,0),(0,-1),(1,0),(0,1)]nx,nyxdir[i][0] ,ydir[i][1]if nx<0 or nx>hx or ny <0 or ny>wy: continueif mp[nx][ny]*:num1print("%d:%s->%d%…

ROS 2边学边练(3)-- 何为节点(nodes)

在接触节点这个概念之前&#xff0c;我们先来看看下面这张动态图&#xff0c;更方便我们理解一些概念和交互过程。 &#xff08;相信大家的英文基础哈&#xff09; 概念 如上图所示&#xff0c;这里面其实涉及到了三个概念&#xff08;功能&#xff09;&#xff0c;分别是节点…

深入解析Spring MVC: 原理、流程【面试版】

什么是SpringMV? 1.是一个基于MVC的web框架&#xff1b; 2.是spring的一个模块&#xff0c;是spring的子容器&#xff0c;子容器可以拿父容器的东西&#xff0c;但是反过来不可&#xff1b; 2.SpringMVC的前端控制器是DispatcherServlet&#xff0c;用于分发请求。使开发变…

009——服务器开发环境搭建及开发方法(上)

目录 一、环境搭建 1.1网络环境 1.2 文件传输环境搭建 1.2.1 nfs环境 1.2.2 tftp环境 1.3 源码环境搭建 1.4 代码托管 1.5 配置交叉编译工具链 二、 开发方式 2.1 内核、设备树、驱动 make mrproper make 100ask_imx6ull_mini_defconfig​编辑 make zImage -j4 m…