首页 > 其他分享 >QT实战 之事件和定时器

QT实战 之事件和定时器

时间:2023-11-22 22:55:49浏览次数:33  
标签:实战 定时器 QT MyLabel 事件 arg ev QString

QT实战 之事件和定时器

  • 自定义控件MyLabel,继承自QLabel(创建时继承自QWidget,创建好后再修改成QLabel)
  • 拖拽Label控件到主界面,然后将该控件提升为MyLabel(注意必须用MyLabel的直接父类进行提升,如果用Widget则无法进行提升)
  • 在MyLabel头文件中中声明重写事件
  • 在MyLabel源文件中重写事件
  • 重写event事件,可以过滤指定的事件,而不派发到具体的事件中
  • 在Widget中为MyLabel安装事件过滤器EventFilter,也可以过滤事件
  • 在Widget中重写timerEvent,可以启动定时任务
  • 在Widget中启动定时器startTimer,可以自动调用timerEvent事件
  • startTimer返回定时器的ID,可以启动多个定时器,执行多个定时任务
  • 在timerEvent事件中,按照不同的ID,来区分不同的定时器,从而执行不同的任务
  • 可以使用QTimer类启动定时任务,需要用connect函数将定时器的timeout信号和槽函数进行连接
  • QTimer类比用timerEvent更加灵活方便,也无需定义全局变量ID区分不同的定时器
  • 注意static int num=1因为是全局静态变量,只会声明一次,因此该语句只会执行一次

#include "widget.h"

#include "ui_widget.h"

#include<QMouseEvent>

#include<QDebug>

#include<QString>

#include<QTimer>

Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

{

    ui->setupUi(this);

    //为控件安装事件过滤器

    ui->label-> installEventFilter(this);

 

    //定时方法1:用定时器事件进行定时操作

    timerId1= startTimer(1000);//定时器 每秒增加1

    timerId2=startTimer(2000);//定时器 每2秒增加1

    timerId3=startTimer(500);//定时器 每0.5秒增加1

 

    //定时方法2:用定时器对象QTimer进行定时操作

    QTimer* timer=new QTimer(this);//用定时器对象进行定时

    timer->start(200);//每0.2秒增加1

    connect(timer,&QTimer::timeout,this,[=](){

        //静态全局变量的声明,只会执行一次

        static int num4=1;

        ui->label_4->setText(QString::number(num4++));

    });

}

//重写定时器事件

void Widget::timerEvent(QTimerEvent * e)

{

    //静态全局变量的声明,只会执行一次

    static int num1=1;

    static int num2=1;

    static int num3=1;

    if(e->timerId()==timerId1)

    {

        ui->label->setText(QString::number(num1++));

    }

    if(e->timerId()==timerId2)

    {

        ui->label_2->setText(QString::number(num2++));

    }

    if(e->timerId()==timerId3)

    {

        ui->label_3->setText(QString::number(num3++));

    }

}

Widget::~Widget()

{

    delete ui;

}

//使用eventFilter拦截事件

bool Widget::eventFilter(QObject *obj, QEvent *e)

{

    //    判定对象

    if(obj==ui->label)

    {

        //        判定事件类型

        if(e->type()==QEvent::MouseButtonPress)

        {

            QMouseEvent *ev=static_cast<QMouseEvent*>(e);

            //用%拼接字符串

            QString str=QString("eventFilter: 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);

}

 

 

#include "mylabel.h"

#include<QDebug>

#include<QString>

#include<QMouseEvent>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)

{

    //    设置鼠标追踪(在鼠标没有按下的情况下,也可以追踪鼠标的移动)

    setMouseTracking(true);

 

}

//鼠标进入事件

void MyLabel:: enterEvent(QEvent* )

{

    qDebug()<<"鼠标进入";

 

}

//鼠标离开事件

void MyLabel:: leaveEvent(QEvent*)

{

    qDebug()<<"鼠标离开";

}

//鼠标移动事件(默认按下鼠标键,才会调用;如果设置了鼠标追踪,则鼠标一移动,就会调用)

void MyLabel:: mouseMoveEvent(QMouseEvent *ev)

{

 

    qDebug()<<"鼠标移动了";

}

//鼠标按下事件

void MyLabel::mousePressEvent(QMouseEvent *ev)

{

    //判断按下的鼠标按键

    if(ev->button()==Qt::LeftButton)

    {

        //用%拼接字符串

        QString str=QString("mousePressEvent 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::RightButton)

    {

        //用%拼接字符串

        QString str=QString("mouseReleaseEvent x=%1 y=%2 globalX=%3 globalY=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());

        qDebug()<<str;

    }

 

}

 

//事件分发器event,可以拦截事件;或自动分发事件;

bool MyLabel::event(QEvent *e)

{

    //如果是鼠标按下事件,就自己处理,不向下分发

    if(e->type()==QEvent::MouseButtonPress)

    {

        QMouseEvent *ev=static_cast<QMouseEvent*>(e);

        //用%拼接字符串

        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表示处理完毕,不再向下分发

    }

    return QLabel::event(e);//对于其他事件由父类的event进行默认处理

}

 

 

标签:实战,定时器,QT,MyLabel,事件,arg,ev,QString
From: https://www.cnblogs.com/zhangdezhang/p/17850539.html

相关文章

  • 【23秋】提高实战营 之 比赛篇
    2023提高实战营-秋专题测试01A.寇德佛斯题目链接A.寇德佛斯简要思路对于题目\(i\)和题目\(j\),假设当前开始了\(w\)时间,如果先做\(i\)再做\(j\),那么得到的分数将会是\(s_i-(w+t_i)·v_i+s_j-(w+t_i+t_j)·v_j\),最后整理一下可得时先做题目\(i\)......
  • 七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门
    前言今天我们花费一个小时快速了解SQLite数据类型、SQLite常用命令和语法。七天.NET8操作SQLite入门到实战详细教程第一天SQLite简介第二天在Windows上配置SQLite环境EasySQLite项目源码地址GitHub地址:https://github.com/YSGStudyHards/EasySQLite......
  • ABP-VNext 用户权限管理系统实战02---用户权限表的创建与迁移
    一、表实体建立1、菜单表[Comment("菜单表")][Table("t_identity_menu")]publicclassMenu:AuditedAggregateRoot<Guid>,ISoftDelete,IMultiTenant{[MaxLength(200)][Comment("菜单名")]publicstringName{get;set;......
  • Java排序实战:如何高效实现电商产品排序
    在当今的数字化时代,电子商务已成为人们日常生活的重要组成部分。消费者可以在电商平台上浏览和购买来自全球的商品,这无疑为我们的生活带来了极大的便利。然而,随着电商平台的规模不断扩大,商品数量的急剧增加,如何对海量商品进行高效排序成为了电商系统开发的一大挑战。一、排序的重......
  • Java排序实战:如何高效实现电商产品排序
    在当今的数字化时代,电子商务已成为人们日常生活的重要组成部分。消费者可以在电商平台上浏览和购买来自全球的商品,这无疑为我们的生活带来了极大的便利。然而,随着电商平台的规模不断扩大,商品数量的急剧增加,如何对海量商品进行高效排序成为了电商系统开发的一大挑战。一、排序的重......
  • windows安装QT时出现“无法下载存档……”解决办法
    参考windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法-CSDN博客使用国内源安装:清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学:http://mirror.bit.edu.cn/qtproject/中国互联网络信息中心:http://mirror.bit.edu.cn/qtproject/步骤:在qt的exe......
  • FP-Growth算法全解析:理论基础与实战指导
    本篇博客全面探讨了FP-Growth算法,从基础原理到实际应用和代码实现。我们深入剖析了该算法的优缺点,并通过Python示例展示了如何进行频繁项集挖掘。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室......
  • 前端项目实战叁佰伍拾陆react-admin和material ui-处理形成树状数据结构2
    dataProviders.getStyleTree('t_prod_category','t_prod_style').then((res:any)=>{console.log(res,"resssssssss")letarr:any=[]letarr1:any=[{key:0,title:"品类管理",......
  • 前端项目实战叁佰伍拾伍react-admin和material ui-处理形成树状数据结构1
    if(data!==undefined){lettemp:ITreeData[]=[{key:'0',title:'工厂管理',children:newArray<ITreeData>()}];//向从数据库查询到的数据中添加Tree结构所需要的字段,key使用id,title使用name;data.forEach(it=>{......
  • 七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境
    前言SQLite的一个重要的特性是零配置的、无需服务器,这意味着不需要复杂的安装或管理。它跟微软的Access差不多,只是一个.db格式的文件。但是与Access不同的是,它不需要安装任何软件,非常轻巧。七天.NET8操作SQLite入门到实战详细教程第一天SQLite简介EasySQLite项目源码地址......