Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)

news2024/11/24 21:41:58

目录

1.1鼠标进入和离开enterEvent\leaveEvent

1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent

1.3定时器事件timerEvent

1.4定时器类QTimer

1.5事件分发器event

 1.6事件过滤器eventFilter


1.1鼠标进入和离开enterEvent\leaveEvent

事件:

鼠标进入函数原型:

[virtual protected] void QWidget::enterEvent(QEvent* event);

鼠标离开函数原型:

[virtual protected] void QWidget::leaveEvent(QEvent* event);

举例:重写鼠标进入离开事件

void MyLable::enterEvent(QEvent *event)
{
    qDebug()<<"鼠标进入";
}

void MyLable::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开";
}

1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent

鼠标按下、释放是瞬间触发的,移动是一个持续性事件

 鼠标按下函数原型:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent* event);

鼠标释放函数原型:

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent* event);

鼠标移动函数原型: 

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent* event);

举例:

void MyLable::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"鼠标按下了";
}

void MyLable::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug()<<"鼠标松开了";
}

void MyLable::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<"鼠标移动了";
}

扩展1:鼠标按下,释放,移动时,分别打印鼠标相对于Label的x、y坐标

 QMouseEvent可以获取鼠标对应的信息

void MyLable::mousePressEvent(QMouseEvent *event)
{
    QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
    qDebug()<<str;
    qDebug()<<"鼠标按下了";
}

void MyLable::mouseReleaseEvent(QMouseEvent *event)
{
    QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
    qDebug()<<str;
    qDebug()<<"鼠标松开了";
}

void MyLable::mouseMoveEvent(QMouseEvent *event)
{
    QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
    qDebug()<<str;
    qDebug()<<"鼠标移动了";
}

扩展2:在MyLabel中鼠标只要移动,就会触发移动事件,不需要按下

将鼠标追踪效果设为true

MyLable::MyLable(QWidget *parent)
    : QLabel{parent}
{
    this->setMouseTracking(true);
}

扩展3:鼠标左键按下时,才会触发相应内容

QMouseEvent对象的button()可以判断鼠标按下的是左键或右键

void MyLable::mousePressEvent(QMouseEvent *event)
{
    if(Qt::LeftButton==event->button())
    {
        QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
        qDebug()<<str;
        qDebug()<<"鼠标按下了";
    }
}

void MyLable::mouseReleaseEvent(QMouseEvent *event)
{
    if(Qt::LeftButton==event->button())
    {
        QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
        qDebug()<<str;
        qDebug()<<"鼠标松开了";
    }
}

void MyLable::mouseMoveEvent(QMouseEvent *event)
{
    if(Qt::LeftButton==event->button())
    {
        QString str=QString("x=%1,y=%2").arg(event->x()).arg(event->y());
        qDebug()<<str;
        qDebug()<<"鼠标移动了";
    }
}

1.3定时器事件timerEvent

需求:两个label,初始值都为1,第一个每隔一秒加一,第二个每隔一秒加二

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
    //重写定时器事件
    void timerEvent(QTimerEvent *event);
    
    //声明两个定时器的唯一标识
    int id1;
    int id2;
private:
    Ui::Widget *ui;
};
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    //1000毫秒,每隔一秒钟会触发timerEvent,startTimer会返回一个唯一标识
    this->id1=startTimer(1000);
    
    this->id2=startTimer(2000);
}

void Widget::timerEvent(QTimerEvent *event)
{
    //QTimerEvent的timerId方法可以获得计时器的唯一标识
    if(event->timerId()==this->id1)
    {
        static int num1=1;
        ui->label->setText(QString::number(num++));
    }
    
    if(event->timerId()==this->id2)
    {
        static int num2=1;
        ui->label->setText(QString::number(num2++));
    }
}

startTimer——启动定时器,单位是毫秒,startTimer会返回一个int类型的唯一标识

1.4定时器类QTimer

 需求:一个label,初始值为1,每隔0.5秒加一;且有一个停止按钮,点击之后,label上的数字停止递增

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    QTimer * timer=new QTimer(this);
    //每隔500毫秒发timeout的信号
    timer->start(500);
    connect(timer,&QTimer::timeout,[=]{
        static int num3=1;
        ui->label_3->setText(QString::number(num++));
    })

    connect(ui->btn_stop,&QPushButton::clicked,[=]{
    timer->stop();
    });
}

注意:

  • start——启动定时器,单位毫秒;超过时间会发timeout的信号
  • stop——停止计时器

1.5事件分发器event

需求:重写一个事件分发器,拦截鼠标按下事件

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

    void mousePressEvent(QMouseEvent *ev);

    bool event(QEvent *e);
signals:

};
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    QString str=QString("鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());
    qDebug()<<str;
}

bool MyLabel::event(QEvent *e)
{
    if(e->type()==QEvent::MouseButtonPress)
    {
        QMouseEvent* ev=static_cast<QMouseEvent*>(e);
        QString str=QString("event事件中鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
        //标识拦截下鼠标按下事件
        return true;
    }
    //其他事件交给父类处理
    return QLabel::event(e);
}

 1.6事件过滤器eventFilter

时间过滤器函数原型:

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

若此事件是感兴趣的类型,返回true,自己进行处理;若不是,返回false,继续转发

事件过滤器使用步骤:

  1. 给控件安装过滤器installEventFilter
  2. 重写过滤器事件eventFilter
    //安装事件过滤器
    ui->label->installEventFilter(this);


    bool Widget::eventFilter(QObject *watched, QEvent *event)
    {
    if(watched==ui->label)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent* ev=static_cast<QMouseEvent*>(event);
            QString str=QString("eventFilter事件中鼠标按下了x=%1,y=%2").arg(ev->x()).arg(ev->y());
            qDebug()<<str;
            //标识拦截下鼠标按下事件
            return true;
        }
    }

    //其他事件交给父类处理
    return QWidget::eventFilter(watched,event);
    }

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

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

相关文章

【Linux清空显存占用】Linux 系统中清理 GPU 显存

操作指令 # 查看NVIDIA GPU状态和进程 nvidia-smi # 查找所有包含"python"的进程 ps -ef | grep python # 强制结束进程号为3023的进程 kill -9 3023截图演示 在 Linux 系统中清理 GPU 显存可以采用以下方法&#xff1a; 1. 终止特定进程&#xff08;常用方法&…

对撞双指针(七)三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组…

vue2-基础核心

vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式&#xff0c;提高代码复用率&#xff0c;让代码更好维护 声明式编码&#xff0c;无需直接操作DOM&#xff0c;提高开发效率&#xff0c;编码简洁、体积小&#xff0c;运行效率高 本…

Prompting LLMs to Solve Complex Tasks: A Review

文章目录 题目简介任务分解未来方向结论 题目 促使 LLM 解决复杂任务&#xff1a; 综述 论文地址&#xff1a;https://www.intjit.org/cms/journal/volume/29/1/291_3.pdf 简介 大型语言模型 (LLM) 的最新趋势显而易见&#xff0c;这体现在大型科技公司的投资以及媒体和在线社…

反射、依赖注入

特性和依赖注入都是基于反射的&#xff0c;同时反射一般和接口配合着使用。 接口隔离原则 接口隔离原则&#xff1a;主张应该把客户端对一个类的需求分解成更小、更具体的接口&#xff0c;而不是提供一个包含所有功能的大接口。 接口中的需求是&#xff1a;乙方不能少给&am…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

VBA技术资料MF229:以毫米为单位设置行高和列宽

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

深入JMeter核心引擎:揭秘JmeterEngine、StandardJmeterEngine、ClientJmeterEngine与Remote的奥秘

引言 Apache JMeter是一款广泛使用的开源性能测试工具&#xff0c;它能够帮助开发者和测试人员模拟大量并发用户对应用程序进行负载测试。JMeter的强大功能和灵活性源于其精心设计的核心引擎。本文将深入探讨JMeter的核心引擎&#xff0c;包括JmeterEngine、StandardJmeterEng…

软件工程导论 选填题知识点总结

一 原型化方法是一种动态定义需求的方法&#xff0c;提供完整定义的需求不是原型化方法的特征&#xff0c;其特征包括尽快建立初步需求、简化项目管理以及加强用户参与和决策。 软件危机的表现包括用户对已完成的软件系统不满意的现象经常发生、软件产品的质量往往靠不住、软件…

Rust中Tracing 应用指南

欢迎来到这篇全面的Rust跟踪入门指南。Rust 的tracing是一个用于应用程序级别的诊断和调试的库。它提供了一种结构化的、异步感知的方式来记录日志和跟踪事件。与传统的日志记录相比&#xff0c;tracing能够更好地处理复杂的异步系统和分布式系统中的事件跟踪&#xff0c;帮助开…

机器学习实战:银行客户是否认购定期存款

项目结构与步骤 1. 项目概述 项目名称&#xff1a;葡萄牙银行电话营销活动分析与定期存款认购预测目标&#xff1a;通过分析银行的电话营销数据&#xff0c;构建模型预测客户是否会认购定期存款。数据来源&#xff1a;葡萄牙银行营销活动数据集关键挑战&#xff1a;数据不平衡…

服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS硬盘组建的raid5阵列&#xff0c;两组阵列划分的LUN组成LVM架构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线。热备盘自动上线替换离线硬盘&#xff0c;但在热备盘上线同步数据…

C++vector

Cvector是标准库中的一员&#xff0c;vector直译过来是“向量”、“矢量”的意思&#xff0c;在C中&#xff0c;是一个动态的数组容器&#xff0c;可以动态的开辟空间&#xff0c;自动实现内存的管理&#xff0c;不需要我们手动操作&#xff0c;在标准库中&#xff0c;写作一个…

“漫步北京”小程序及“气象景观数字化服务平台”上线啦

随着科技的飞速发展&#xff0c;智慧旅游已成为现代旅游业的重要趋势。近日&#xff0c;北京万云科技有限公司联合北京市气象服务中心&#xff0c;打造的“气象景观数字化服务平台“和“漫步北京“小程序已经上线&#xff0c;作为智慧旅游的典型代表&#xff0c;以其丰富的功能…

LlamaIndex+本地部署InternLM实践

LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 ‌LlamaIndex‌是一个将大语言模型&#xff08;LLMs&#xff09;和外部数据连接在一起的工具&#xff0c;主要用于增强大模型的知识获取能力…

【阵列信号处理】相干信号和非相干信号生成

文章目录 一、总结二、知识点相干&#xff08;coherent&#xff09;和非相干&#xff08;incoherent&#xff09;信号相干信号生成代码 相关信号&#xff08;correlated signal&#xff09;相关信号生成代码 正交信号定义 本文记录博主的科研日记。如果对博主的其他文章感兴趣&…

vue3项目部署在阿里云轻量应用服务器上

文章目录 概要整体部署流程技术细节小结 概要 vue3前端项目部署在阿里云轻量服务器 整体部署流程 首先有一个Vue3前端项目和阿里云应用服务器 确保环境准备 如果是新的服务器&#xff0c;在服务器内运行以下命令更新软件包 sudo apt update && sudo apt upgrade -y …

东土科技孵化的“网联汽车高速通信技术”前沿产品亮相2024WICV大会

2024世界智能网联汽车大会&#xff08;WICV&#xff09;于近日在北京召开。本次大会发布了由中国汽车工程学会组织全球200余位专家&#xff0c;联合评审遴选出未来十年对于智能网联汽车发展具有重要影响的十大技术趋势&#xff0c;包括“面向高级别自动驾驶的超级人工智能”“网…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”&#xff1f;三、为什么有必要采用纵深安全防御策略&#xff1f;四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

关于相机选型的一些参数说明

上一篇&#xff1a;关于相机的一些参数计算&#xff08;靶面、视野等&#xff09; 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS&#xff1a;视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…