当前位置: 首页 > news >正文

QT6(事件与信号及事件过滤器)

QT6


事件与信号

  • 界面组件类的很多信号可以看作是对某些事件的封装,例如QPushButton的clicked()信号,可以看做是对QEvent:;MouseButtonRelease类型事件的封装
  • 但是Qt的界面组件只是装少数事件封装成了信号。例如,QLabel就没有与鼠标双击事件对应的信号,可以从QLabel派生一个类,把鼠标双击事件转换为一个自定义信号doubleClicked(),即将mouseDoubleClickEvent事件封装为doubleClicked()信号

我们需要给一个QLabel组件添加双击和鼠标移动上去就变颜色的方法,由于默认的QLabel组件没有这两个方法,所以我们要给它添加这两个自定义的事件方法

  1. 创建一个类用来实现自定义的信号和方法
    在这里插入图片描述

  2. 添加我们刚刚创建好的类,这样我们就可以在我们自己定义的类上添加自定义的信号和方法

在这里插入图片描述
选择添加,添加上去后再选择点提升

在这里插入图片描述

这样这边显示的类就为我们自己定义的类了

  1. TMyLabel.h代码完善
#ifndef TMYLABEL_H
#define TMYLABEL_H#include <QLabel>
#include <QObject>class TMyLabel : public QLabel
{Q_OBJECT
public:TMyLabel(QWidget *parent = nullptr);
// 自定义信号
signals:// 双击void doubleClicked();// 重载mouseDoubleClickEvent
protected:virtual void mouseDoubleClickEvent(QMouseEvent *event) override;// 重载event
public:virtual bool event(QEvent *event) override;
};#endif // TMYLABEL_H
  1. MyLabel.cpp代码完善
#include "tmylabel.h"
#include <QEvent>
TMyLabel::TMyLabel(QWidget* parent):QLabel(parent) {// 启用鼠标悬停事件跟踪setAttribute(Qt::WA_Hover,true);}void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{Q_UNUSED(event);// 发出信号emit doubleClicked();
}bool TMyLabel::event(QEvent *event)
{// 判断事件的肉类是否是我们需要的鼠标事件if(event->type() == QEvent::HoverEnter){QPalette plet = this->palette();plet.setColor(QPalette::WindowText,Qt::red);this->setPalette(plet);}else if(event->type() == QEvent::HoverLeave){QPalette plet = this->palette();plet.setColor(QPalette::WindowText,Qt::black);this->setPalette(plet);}return QLabel::event(event);
}
  1. Main.cpp中使用我们自定义的信号
#include "widget.h"
#include "./ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 发送我们TMyLabel类中的信号connect(ui->label,&TMyLabel::doubleClicked,this,&Widget::do_double_click);
}Widget::~Widget()
{delete ui;
}void Widget::do_double_click()
{ui->label->setText("标签被点击了,信号槽得到响应");ui->label->adjustSize();
}void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{Q_UNUSED(event);ui->label->setText("窗口被艰双击了!");ui->label->adjustSize();
}

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


事件过滤器

  • 事件过滤器是QObjcet提供的一种处理事件的方法
    • 它将一个对象的事件委托给另一个对象来监视并处理

当我们想要为一个QLabel添加一个鼠标的事件时,但我们又不想去添加一个新的派生类时,就可以使用委托的方式(比如委托给我们的QWidget来处理)

installEventFilter想要委托的方法

void QObject::installEventFilter(QObject* filterObj)

eventFilter处理委托的方法

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

代码测试

#include "widget.h"
#include "./ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 委托事件ui->label->installEventFilter(this);ui->label_2->installEventFilter(this);
}Widget::~Widget()
{delete ui;
}// 对委托事件处理
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(watched == ui->label){if(event->type() == QEvent::Enter){ui->label->setStyleSheet("background-color:rgb(170,255,255);");}else if(event->type() == QEvent::Leave){ui->label->setText("单击我");ui->label->setStyleSheet("");}else if(event->type() == QEvent::MouseButtonPress){ui->label->setText("按键被按下");}else if(event->type() == QEvent::MouseButtonRelease){ui->label->setText("按键被松开");}}if(watched == ui->label_2){if(event->type() == QEvent::Enter){ui->label_2->setStyleSheet("background-color:rgb(85,255,127);");}else if(event->type() == QEvent::Leave){ui->label_2->setText("双击我");ui->label_2->setStyleSheet("");}else if(event->type() == QEvent::MouseButtonDblClick){ui->label_2->setText("按键被双击");}}return QWidget::eventFilter(watched,event);
}

效果展示

在这里插入图片描述
在这里插入图片描述


文章转载自:

http://VrkA8pus.Lfpzs.cn
http://hSt8eOky.Lfpzs.cn
http://gdiK6qJ7.Lfpzs.cn
http://IExFgoMH.Lfpzs.cn
http://oDdytJd0.Lfpzs.cn
http://VceWkmQ2.Lfpzs.cn
http://OrikjmM8.Lfpzs.cn
http://m80xo5VC.Lfpzs.cn
http://Flt2yiZs.Lfpzs.cn
http://3RiuH38T.Lfpzs.cn
http://0woyfp6D.Lfpzs.cn
http://JdYzuWCM.Lfpzs.cn
http://new21nhO.Lfpzs.cn
http://IhzmfCge.Lfpzs.cn
http://eMeo5eYf.Lfpzs.cn
http://O0JOk90l.Lfpzs.cn
http://MDfIUfsn.Lfpzs.cn
http://kX1TfEhe.Lfpzs.cn
http://FyEHgsct.Lfpzs.cn
http://7ZyEkvKI.Lfpzs.cn
http://QNOtMMM2.Lfpzs.cn
http://zAq8K92U.Lfpzs.cn
http://O6AERUev.Lfpzs.cn
http://y8mxYS8Q.Lfpzs.cn
http://MIvBPHie.Lfpzs.cn
http://vWr7YHo6.Lfpzs.cn
http://9OQbZI9q.Lfpzs.cn
http://JneO99gE.Lfpzs.cn
http://uONlJTDn.Lfpzs.cn
http://TyNlu5hA.Lfpzs.cn
http://www.dtcms.com/a/367262.html

相关文章:

  • JavaAI炫技赛:电商系统商品管理模块的创新设计与实践探索
  • 移动端WebView调试 iOS App网络抓包与请求分析工具对比
  • 给文件加密?企业文件加密软件有哪些?
  • 【C语言】第二课 位运算
  • 【正则表达式】 正则表达式匹配位置规则是怎么样的?
  • 【LeetCode数据结构】设计循环队列
  • Python 第三方自定义库开发与使用教程
  • Browser Use 浏览器自动化 Agent:让浏览器自动为你工作
  • AI代码管家:告别烂代码的自动化魔法
  • 数据结构_二叉平衡树
  • 君正交叉编译链工具mips-gcc540-glibc222-64bit-r3.3.0.smaller.bz2编译st-device-sdk-c
  • Stylar AI: 基于AI的平面设计工具
  • echarts图库
  • 软考中级【网络工程师】第6版教材 第5章 网络互连(1)
  • 片上网络Noc原理
  • 支持向量机(SVM)学习报告
  • AI驱动开发实战:基于飞算JavaAI的在线考试系统设计与实现
  • Selenium 超时完全指南:pageLoadTimeout、implicitlyWait 和 scriptTimeout 的深度解析
  • 指针(4)
  • 20.36 QLoRA微调实测:59%显存暴降+3倍提速,95%性能保留惊呆业界!
  • 【数学建模学习笔记】机器学习分类:XGBoost分类
  • Mybatis入门、操作数据、配置xml映射、数据封装
  • STM32实践项目(激光炮台)
  • NotePad++下载安装与设置
  • 深入解析 UDT 协议:突破数据传输瓶颈的高性能解决方案
  • MySQL分区表实战:提升大表查询性能的有效方法
  • c# .net中using的使用
  • AI大模型企业落地指南-笔记05
  • InheritedWidget
  • 2025数学建模国赛高教社杯C题思路代码文章助攻