Qt---事件

news2025/1/20 5:58:52

一、Qt中的事件

鼠标事件
        鼠标进入事件enterEvent

        鼠标离开事件leaveEvent

        鼠标按下mousePressEvent ( QMouseEvent ev)
        鼠标释放mouseReleaseEvent
        鼠标移动mouseMoveEvent

ev->x():×坐标        ev->y():y坐标
ev->button()可以判断所有按键Qt::LeftButton        Qt::RightButton
ev->buttons()判断组合按键,判断move时候的左右键,结合&操作符

格式化字符串        Qstring(“ %1 %2" ).arg(111 ).arg(222)
设置鼠标追踪        setMouseTracking(true);

代码示例:

mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>

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

    //鼠标进入事件
    void enterEvent(QEvent *event);

    //鼠标离开事件
    void leaveEvent(QEvent *);

    //鼠标按下
    void mousePressEvent(QMouseEvent *ev);

    //鼠标释放
    void mouseReleaseEvent(QMouseEvent *ev);

    //鼠标移动
    void mouseMoveEvent(QMouseEvent *ev);

signals:

};

#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"
#include<QDebug>
#include<QMouseEvent>

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪
    setMouseTracking(true);
}

//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
    //qDebug()<<"鼠标进入了";
}

//鼠标离开事件
void myLabel::leaveEvent(QEvent *event)
{
    //qDebug()<<"鼠标离开了";
}

//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{
    //当鼠标左键按下 提示信息
//    if (ev->button() == Qt::LeftButton)
//    {
        QString str = QString("鼠标按下了 x = %1 y = %2  globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
//    }
}

//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
//    if (ev->button() == Qt::LeftButton)
//    {
        QString str = QString("鼠标释放了 x = %1 y = %2  globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
//    }
}

//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
//    if (ev->buttons() & Qt::LeftButton)
//    {
        QString str = QString("鼠标移动了 x = %1 y = %2  globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
//    }
}

输出如下所示:

二、定时器

定时器1

        利用事件void timerEvent ( QTimerEvent* ev)

        启动定时器startTimer( 1000)毫秒单位
        timerEvent的返回值是定时器的唯一标识可以和ev->timerld做比较

定时器2
        利用定时器类QTimer
        创建定时器对象QTimer * timer = new QTimer(this)

        启动定时器timer->start(毫秒)
        每隔一定毫秒,发送信号timeout,进行监听

        暂停timer->stop

代码示例:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    //重写定时器事件
    void timerEvent(QTimerEvent *);

    int id1;//定时器1的唯一标识
    int id2;//定时器2的唯一标识

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QTimer>//定时器的类
#include<QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //启动定时器
    id1 = startTimer(1000);//参数1 间隔 单位为毫秒

    id2 = startTimer(2000);

    //定时器第二种方式
    QTimer *timer = new QTimer(this);
    //启动定时器
    timer->start(500);

    connect(timer,&QTimer::timeout,[=](){
        static int num = 1;

        //laebl_4每隔0.5秒+1
        ui->label_4->setText(QString::number(num++));
    });

//    //点击暂停按钮,实现停止定时器
//    connect(ui->btn1,&QPushButton::clicked,[=](){
//        timer->stop();
//    });

//    //点击开始按钮,实现开始定时器
//    connect(ui->btn2,&QPushButton::clicked,[=](){
//        timer->start();
//    });

    //一个按钮实现暂停和开始定时器
    connect(ui->btn1,&QPushButton::clicked,[=](){
        if(ui->btn1->text()=="暂停")
        {
            ui->btn1->setText("开始");
            timer->stop();
        }
        else if(ui->btn1->text()=="开始")
        {
            ui->btn1->setText("暂停");
            timer->start();
        }

    });

}

void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId() == 1)
    {
        static int num = 1;

        //laebl_2每隔1秒+1
        ui->label_2->setText(QString::number(num++));
    }


    if(ev->timerId() == 2)
    {
        static int num2 = 1;

        //laebl_3每隔2秒+1
        ui->label_3->setText(QString::number(num2++));
    }

}

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

输出如下所示:(单个按钮和两个按钮实现同信号和槽部分练习)

三、event事件分发器

用途:用于事件的分发,也可以做拦截操作,不建议

bool event( QEvent*e); 
返回值如果是true 代表用户处理这个事件,不向下分发了

e->type()== 鼠标按下

代码示例:

bool myLabel::event(QEvent *e)
{
    //如果是鼠标按下,在event事件分发中做拦截
    if(e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *ev = static_cast<QMouseEvent *>(e);//把QEvent *e转为QMouseEvent *ev
        QString str = QString("Event函数中:鼠标按下了 x = %1 y = %2  globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;

        return true;//true代表用户自己处理这个事件,不向下分发
    }

//    if(e->type() == QEvent::MouseButtonRelease)
//        {
//            qDebug()<<"Event函数中:鼠标释放事件";
//            return true;
//        }

    //其他时间交给父类处理->默认处理
    return QLabel::event(e);
}

输出如下所示:

四、事件过滤器

在程序将时间分发到事件分发器前,可以利用过滤器做拦截

步骤
        1. 给控件安装事件过滤器
        2. 重写eventFilter函数(obj , ev)

代码示例:

#include "widget.h"
#include "ui_widget.h"
#include<QTimer>//定时器的类
#include<QPushButton>
#include<QMouseEvent>
#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //启动定时器
    id1 = startTimer(1000);//参数1 间隔 单位为毫秒

    id2 = startTimer(2000);

    //定时器第二种方式
    QTimer *timer = new QTimer(this);
    //启动定时器
    timer->start(500);

    connect(timer,&QTimer::timeout,[=](){
        static int num = 1;

        //laebl_4每隔0.5秒+1
        ui->label_4->setText(QString::number(num++));
    });

    //点击暂停按钮,实现停止定时器
    connect(ui->btn1,&QPushButton::clicked,[=](){
        timer->stop();
    });

//    //点击开始按钮,实现开始定时器
//    connect(ui->btn2,&QPushButton::clicked,[=](){
//        timer->start();
//    });

//    //一个按钮实现暂停和开始定时器
//    connect(ui->btn1,&QPushButton::clicked,[=](){
//        if(ui->btn1->text()=="暂停")
//        {
//            ui->btn1->setText("开始");
//            timer->stop();
//        }
//        else if(ui->btn1->text()=="开始")
//        {
//            ui->btn1->setText("暂停");
//            timer->start();
//        }

//    });

    //给label1安装事件过滤器
    //步骤1 安装事件过滤器
    ui->label->installEventFilter(this);
}

//步骤2   重写eventfilter事件
bool Widget::eventFilter(QObject *obj,QEvent *e)
{
    if(obj == ui->label)
    {
        if(e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *ev = static_cast<QMouseEvent *>(e);//把QEvent *e转为QMouseEvent *ev
            QString str = QString("事件过滤器中:鼠标按下了 x = %1 y = %2  globalX = %3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<str;

            return true;//true代表用户自己处理这个事件,不向下分发
        }
    }

    //其他默认处理
    return QWidget::eventFilter(obj,e);
}

void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId() == 1)
    {
        static int num = 1;

        //laebl_2每隔1秒+1
        ui->label_2->setText(QString::number(num++));
    }


    if(ev->timerId() == 2)
    {
        static int num2 = 1;

        //laebl_3每隔2秒+1
        ui->label_3->setText(QString::number(num2++));
    }

}

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

输出如下所示:

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

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

相关文章

day11-IO流

IO流 1 IO流的概述和分类 1.1学习IO流的目的&#xff1f; 1&#xff0c;将数据写到文件中&#xff0c;实现数据永久化存储 2&#xff0c;读取文件中已经存在的数据 1.2 IO流概述 其中&#xff1a;I表示intput&#xff0c;是数据从硬盘进内存的过程&#xff0c;称之为读。…

远程调用feign的使用

在orderservice子工程中 <!--feign的远程--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>启动类加上这个注解 EnableFeignClients //自动装配…

Python+PySpark数据计算

1、map算子 对RDD内的元素进行逐个处理&#xff0c;并返回一个新的RDD&#xff0c;可以使用lambda以及链式编程&#xff0c;简化代码。 注意&#xff1a;再python中的lambda只能有行&#xff0c;如果有多行&#xff0c;要写成外部函数&#xff1b;&#xff08;T&#xff09;-&…

考研操作系统-1.计算机系统概述

王道考研操作系统-1.计算机系统概述 操作系统 是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;合理地组织调度计算机的工作和资源的分配&#xff1b;提供给用户和软件方便的接口和环境&#xff1b;是计算机系统中最基本的系统软件。 应包括&#xff1a; 1&#xf…

阿里云 物联网平台 MQTT连接、数据传输

阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机&#xff0c;读取设备、仪器、MES或者电子元器件的数据&#xff0c;MQTT传输至阿里云平台&#xff0c;可视化界面构建界面&#…

Kafka应用Demo:指派分区订阅消息消费

环境准备 Kafka环境搭建和生产者样例代码与《Kafka应用Demo&#xff1a;按主题订阅消费消息》相同。 消费者代码样例 public class KafkaConsumerService {private static final Logger LOGGER LoggerFactory.getLogger(KafkaConsumerService.class);private static final S…

练习队列的相关操作:循环队列

1. 思路解析 循环队列就是在只有有限的空间时使用队列实现循环存储数据&#xff0c;有双向链表和数组两种选择&#xff0c;这里我们使用数组实现循环队列&#xff08;因为链表我不会 >-<&#xff09; 2. 相关函数及其实现 2.1 判空与判满 判空&#xff1a;直接返回头尾…

NX/UG二次开发—3D几何—多边形内部最大圆

多边形内部最大圆&#xff0c;为什么不能说最大内切圆&#xff1f;如果正方形或正凸多边形&#xff0c;最大内部圆是与边相切的&#xff0c;但对于不规则多边形&#xff0c;很多情况是正好经过一些凹点。 本次介绍在NX中计算封闭边界内部最大圆&#xff1a; 1、首先按顺序排序…

ASP.NET一种基于C2C模式的网上购物系统的设计与实现

摘 要 网络购物已经慢慢地从一个新鲜的事物逐渐变成日常生活的一部分&#xff0c;以其特殊的优势而逐渐深入人心。本课题是设计开发一种基于C2C模式的网上购物系统。让各用户使用浏览器进行商品浏览。注册用户可以轻松的展示自己的网络商店&#xff0c;能对自己的用户信息进行…

华为机试打卡 HJ2 计算某字符出现次数

要机试了&#xff0c;华孝子求捞&#xff0c;功德 描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 1≤&a…

SM935,SM942,SM150和利时备件

SM935,SM942,SM150和利时备件。组态软件&#xff0c;可组态控制图、机柜布置图、电源分配图等&#xff0c;可编辑、编译、SM935,SM942,SM150和利时备件。工程师站组态的基本步骤&#xff1a;SM935,SM942,SM150和利时备件。 1. 根据生产现场的控制方案画出控制系统原理图 2. 根据…

自动秒收录网址导航分类目录模板

自动秒收录网址导航是一个以html5css3进行开发的免费版网址自动收录模板源码。 模板特点&#xff1a;全站响应式H5网站制作技术&#xff0c;一个网站适应不同终端&#xff0c;模板支持网址导航一键采集入库&#xff0c;免规则文章资讯智能批量采集内置伪原创&#xff0c;本地化…

笔记3:torch训练测试VGG网络

&#xff08;1&#xff09;利用Netron查看网络实际情况 上图链接 python生成上图代码如下&#xff0c;其中GETVGGnet是搭建VGG网络的程序GETVGGnet.py&#xff0c;VGGnet是该程序中的搭建网络类。netron是需要pip安装的可视化库&#xff0c;注意do_constant_foldingFalse可以防…

Redis数据结构扩容源码分析

1 Redis数据结构 redis的数据存储在dict.中&#xff0c;其数据结构为(c源码) ypedef struct dict { dictType *type; //理解为面向对象思想&#xff0c;为支持不同的数据类型对应dictType抽象方法&#xff0c;不同的数据类型可以不同实现 void *privdata; //也可不同的数据类…

[AutoSar]BSW_Diagnostic_004 ReadDataByIdentifier(0x22)的配置和实现

目录 关键词平台说明背景一、配置DcmDspDataInfos二、配置DcmDspDatas三、创建DcmDspDidInfos四、创建DcmDspDids五、总览六、创建一个ASWC七、mapping DCM port八、打开davinci developer&#xff0c;创建runnabl九、生成代码 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、…

Maven:继承和聚合

Maven高级 分模块设计和开发 如果在我们自己的项目中全部功能在同一个项目中开发,在其他项目中想要使用我们封装的组件和工具类并不方便 不方便项目的维护和管理 项目中的通用组件难以复用 所以我们需要使用分模块设计 分模块设计 在项目设计阶段,可以将大的项目拆分成若…

欢乐钓鱼大师攻略,兑换码怎么操作?

在努力钓鱼的同时&#xff0c;别忘了收获丰富的奖励和成就&#xff0c;这将是你在游戏中的最大动力和满足感。 完成任务和挑战&#xff1a; 游戏中有各种各样的任务和挑战等着你去完成。通过完成这些任务和挑战&#xff0c;你可以获得丰富的奖励和成就&#xff0c;提升自己的钓…

[Java EE] 文件IO(一):文件概念与文件系统操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

android studio配置Http Proxy

1、问题描述&#xff1a; Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request” 解决&#xff1a;HTTP Proxy设置 1.File→Settings…→System Settings → HTTP Proxy → Auto-detect proxy settings”&#xff1b; 2.勾选下方“Automatic prox…

景源畅信电商:经营抖店需要电脑吗?

经营抖店是否需要电脑?这个问题看似简单&#xff0c;实则关乎着商家的运营效率和成本投入。在当前数字化、网络化的商业环境中&#xff0c;电脑已经成为了不可或缺的工具。那么&#xff0c;经营抖店究竟是否需要电脑呢?答案是肯定的。 一、高效处理订单 电脑能够高效地处理大…