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

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目录

  • 引出
  • 定时器事件
    • QTimerEvent
    • QTimer
  • 事件的分发
    • 事件过滤器
  • 总结
  • QT中的鼠标事件
    • 定义QLable的鼠标进入离开事件
    • 提升为myLabel
    • 重写QLabel的函数
      • 鼠标的事件
      • 鼠标的左中右键枚举
      • 鼠标多事件获取和鼠标移动
      • 鼠标追踪
  • QT中的信号和槽
    • 自定义信号和槽
      • 1.自定义信号
      • 2.自定义槽
      • 3.建立连接
      • 4.进行触发
    • 自定义信号重载
      • 带参数的
      • 按钮触发
      • 信号触发信号
      • 拓展
    • lambda表达式
      • 返回值
      • mutable修饰
      • 案例

引出

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

在这里插入图片描述


定时器事件

QTimerEvent

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// 重写定时器事件void timerEvent(QTimerEvent *);int id1; // 定时器1的唯一标识int id2; // 定时器2的唯一标识private:Ui::Widget *ui;
};
#endif // WIDGET_H

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何定义多个定义器事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 启动定时器// 参数1 间隔 单位 毫秒id1 = startTimer(1000);id2 = startTimer(2000);
}void Widget::timerEvent(QTimerEvent * ev)
{if(ev->timerId()==id1){static int num =1;// label1 每间隔1秒ui->label_2->setText(QString::number(num++));}// label2 每间隔2sif(ev->timerId()==id2){static int num2 = 1;ui->label_3->setText(QString::number(num2++));}// label3 每间隔3s}Widget::~Widget()
{delete ui;
}

QTimer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定时器实现的另一种方式:实例化定时器QTimer 然后加到对象树上

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

进行定时信号的发送和处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 启动定时器// 参数1 间隔 单位 毫秒id1 = startTimer(1000);id2 = startTimer(2000);// 定时器的第二种方式,实例化,加到对象树上QTimer *timer = new QTimer(this);//  启动定时器timer->start(500); // 每隔500msconnect(timer,&QTimer::timeout,[=](){static int num = 1;ui->label_4->setText(QString::number(num++));});// 点击暂停按钮,停止定时器connect(ui->btnStop,&QPushButton::clicked,[=](){timer->stop();});}void Widget::timerEvent(QTimerEvent * ev)
{if(ev->timerId()==id1){static int num =1;// label1 每间隔1秒ui->label_2->setText(QString::number(num++));}// label2 每间隔2sif(ev->timerId()==id2){static int num2 = 1;ui->label_3->setText(QString::number(num2++));}// label3 每间隔3s}Widget::~Widget()
{delete ui;
}

事件的分发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过重写event事件分发器,拦截鼠标按下的的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

事件的枚举类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

静态类型转换方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标按下的事件拦截,自己处理,返回True;
其他事件交给父类进行处理,默认处理;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bool myLabel::event(QEvent *e)
{// 如果是鼠标按下,在event事件分发中做拦截操作if(e->type()==QEvent::MouseButtonPress){QString str1 = QString("鼠标按下了,在event事件分发中处理");qDebug() << str1;// 需要进行类型转换QMouseEvent * ev = static_cast<QMouseEvent *>(e);QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true; // 代表用户自己处理,不向下分发}// 其他事件,交给父类处理,默认处理return QLabel::event(e);
}

事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以在event之前,再做一次高级的拦截

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤:1.给label1安装事件过滤器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤二:重写事件过滤器的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里有两个参数,obj 和 e,一个用于判断控件,另一个用来判断事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类
#include <QDebug>
#include <QMouseEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 启动定时器// 参数1 间隔 单位 毫秒id1 = startTimer(1000);id2 = startTimer(2000);// 定时器的第二种方式,实例化,加到对象树上QTimer *timer = new QTimer(this);//  启动定时器timer->start(500); // 每隔500msconnect(timer,&QTimer::timeout,[=](){static int num = 1;ui->label_4->setText(QString::number(num++));});// 点击暂停按钮,停止定时器connect(ui->btnStop,&QPushButton::clicked,[=](){timer->stop();});}void Widget::timerEvent(QTimerEvent * ev)
{if(ev->timerId()==id1){static int num =1;// label1 每间隔1秒ui->label_2->setText(QString::number(num++));}// label2 每间隔2sif(ev->timerId()==id2){static int num2 = 1;ui->label_3->setText(QString::number(num2++));}// 给label1安装事件过滤器// 步骤1:安装事件的过滤器ui->label->installEventFilter(this);
}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("事件过滤器===鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true;}}// 其他默认处理return QWidget::eventFilter(obj,e);}Widget::~Widget()
{delete ui;
}

总结

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

QT中的鼠标事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定义QLable的鼠标进入离开事件

注意这里的QWidget后面要改成QLabel

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include "mylabel.h"
#include <QDebug>myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{qDebug() << "鼠标进入了";
}// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{qDebug() << "鼠标离开了";
}

提升为myLabel

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重写QLabel的函数

鼠标的事件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于控件的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标的左中右键枚举

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鼠标多事件获取和鼠标移动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

头文件

#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 *);// 鼠标放下和释放virtual void mousePressEvent(QMouseEvent *ev);virtual void mouseReleaseEvent(QMouseEvent *ev);// 鼠标的移动virtual void mouseMoveEvent(QMouseEvent *ev);signals:};#endif // MYLABEL_H

cpp文件

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
//    qDebug() << "鼠标进入了";
}// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
//    qDebug() << "鼠标离开了";
}// 鼠标放下和释放
void myLabel::mousePressEvent(QMouseEvent *ev)
{// 鼠标左键按下打印if(ev->button() == Qt::LeftButton){QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{qDebug() << "鼠标释放";
}// 鼠标的移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{if(ev->buttons() & Qt::LeftButton){qDebug() << "鼠标移动";}
}

鼠标追踪

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

QT中的信号和槽

自定义信号和槽

1.自定义信号

写到signals下
返回void
需要声明,不需要实现
可以有参数,可以重戟

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.自定义槽

返回void
需要声明,也需要实现
可以有参数,可以重载
写到public slot下或者public或者全局函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.建立连接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

// 老师饿了,学生请吃饭
connect(te,&Teacher::hungry,st,&Student::treat);

4.进行触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义信号重载

当自定义信号和槽出现重载
8.1 需要利用还数指针明确指向函数的地址·
8.2void(Teacher::tsignal )QString )=&Teacher::hungry;
8.3 QString转成char *
8.3.1.ToUtf80转为QByteArray
8.3.2.Data0转为Char *
8.4信号可以连接信号
8.5断开信号disconnect

带参数的

    void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;void (Student::*StudentSlot)(QString) = &Student::treat;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void Student::treat(QString foodName){// QString -> char * 先转成QByteArray(.toUtf8())  再转成Char* ()qDebug() << "请老师吃。。。" << foodName.toUtf8().data();
}

按钮触发

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 用一个按钮调用下课QPushButton *btn = new QPushButton("下课了",this);// 重置窗口daxiaothis->resize(600,400);connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);

信号触发信号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    // 无参的信号和槽连接void (Teacher::*teacherSignal2)(void) = &Teacher::hungry;void (Student::*StudentSlot2)(void) = &Student::treat;connect(te,teacherSignal2,st,StudentSlot2);// 信号连接信号connect(btn,&QPushButton::clicked,te,teacherSignal2);

断开信号disconnect

拓展

1、信号是可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个糟函数
4、信号和槽函数的参数必须类型一一对应
5、信号和槽的参数个数是不是要一致?信号的参数个数可以多余槽函数的参数个数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

connect(信号的发送者,发送的信号signal信号),信号接受者,槽函数SLOT)
优点:参数直观
缺点:编译器不会检测爸数类型:

lambda表达式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

在这里插入图片描述

    [=](){btn->setText("aaa");}();

返回值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    int ret = []()->int{return 1000;}();qDebug() << "ret = " << ret;

mutable修饰

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton *myBtn1 = new QPushButton(this);QPushButton *myBtn2 = new QPushButton(this);myBtn1->move(100,100);int m = 10;connect(myBtn1,&QPushButton::clicked,this,[m]()mutable {m=100+10;qDebug()<< m;});connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});qDebug() << m;

案例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    QPushButton * btnClose = new QPushButton;btnClose->setText("close");btnClose->move(100,0);btnClose->setParent(this);connect(btnClose,&QPushButton::clicked,this,[=](){btnClose->setText("关闭");emit te->hungry("娃哈哈");
//        this->close();});

相关文章:

  • 【软件工程】计算机内存单位解析及换算
  • vue3中svg图标的封装与使用
  • 万字 | 菊花厂C语言编程10大规范
  • Python基础小知识问答系列-过滤列表元素
  • python 基础综合应用——小开发
  • Swift 定制 Core Data 迁移
  • JavaScript 原型链那些事
  • 3D鸡哥又上开源项目!单图即可生成,在线可玩
  • Spring Boot 学习第八天:AOP代理机制对性能的影响
  • 【Spring Boot 源码学习】初识 ConfigurableEnvironment
  • 数据结构(3.8)——栈的应用
  • gdb调试命令大全
  • 【产品经理】订单处理11-订单修改场景梳理
  • 泛微开发修炼之旅--29用计划任务定时发送邮件提醒
  • RISC-V在当前计算架构中的地位
  • [笔记] php常见简单功能及函数
  • [译]如何构建服务器端web组件,为何要构建?
  • 「面试题」如何实现一个圣杯布局?
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • echarts花样作死的坑
  • github从入门到放弃(1)
  • If…else
  • java概述
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JAVA之继承和多态
  • Theano - 导数
  • Vue UI框架库开发介绍
  • 代理模式
  • 第十八天-企业应用架构模式-基本模式
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于遗传算法的优化问题求解
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端攻城师
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 探索 JS 中的模块化
  • 移动端唤起键盘时取消position:fixed定位
  • 白色的风信子
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # .NET Framework中使用命名管道进行进程间通信
  • #{} 和 ${}区别
  • (java)关于Thread的挂起和恢复
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包