Qt---事件

一、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_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

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秒+1ui->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秒+1ui->label_2->setText(QString::number(num++));}if(ev->timerId() == 2){static int num2 = 1;//laebl_3每隔2秒+1ui->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 *evQString 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函数(obi , 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秒+1ui->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 *evQString 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秒+1ui->label_2->setText(QString::number(num++));}if(ev->timerId() == 2){static int num2 = 1;//laebl_3每隔2秒+1ui->label_3->setText(QString::number(num2++));}}Widget::~Widget()
{delete ui;
}

输出如下所示:

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

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

相关文章

C语法:格式符号%f和%lf引发的错误

今天编程时有如下代码&#xff1a; #include"stdio.h"int main(void) {double profit;double bonus;printf("请输入本月利润\n");scanf("%f",&profit);//错误&#xff1a;此行profit是double类型&#xff0c;格式符为%f,当输入8时&#xff0…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符&#xff08;变量、函数、属性或函数参数的名称&#xff09;&#xff1a;一般使用驼峰法命名&#xff0c;关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线&#xff08;_&#xff09;或美元符号…

C#利用ClearScript执行Javascript脚本

1&#xff0c;新建.netframework winform工程 2&#xff0c;打开nuget程序包管理界面&#xff0c;安装Microsoft.ClearScript.V8&#xff0c;Microsoft.ClearScript.V8.Native.win-x64. 3,编写Javascript脚本,另存为demo.js function testFunc(t) {return t "&#xf…

docker 部署SSM项目(包含打包)

一&#xff1a;SSM项目打包 1.这个一定要勾选防止静态资源没打包上 2.第二步 3.第三步 4.更改名字(注意部署到线上的时候这里如果用docker或者window部署的话需要带这个项目名&#xff0c;不然会出现找不到接口的情况) ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

变量的结构赋值

3.1 数组的结构赋值 3.1.1基本用法 ES6允许按照一定模式从数组和对象中提取值&#xff0c;然后对变量进行赋值&#xff0c;这被称为解构&#xff08;Destructuring&#xff09;。 以前&#xff0c;为变量赋值只能直接指定值。let a 1&#xff1b; let b 2&#xff1b; let …

MCU通过UART/SPI等接口更新flash的方法

MCU可提供一种方便的方式来更新flash内容以进行错误修复bugfix或产品更新update。可以使用以下任何模式更新flash内容: •系统内编程(ISP,In-System Programming):用于使用内部bootloader程序和UART/SPI对片上闪存进行编程program或重新编程reprogram。 •应用程序内编程…

鸿蒙开发实战:轻松配置多环境目录,实现高效应用部署

引言 在鸿蒙应用的开发过程中&#xff0c;经常需要针对不同的环境&#xff08;如开发环境、生产环境&#xff09;配置不同的参数和资源。本文将深度解析如何在鸿蒙中灵活配置多环境目录&#xff0c;分享实战经验&#xff0c;让你的应用部署更加高效便捷。 一、配置环境参数 …

comfyui安装deforum启动不了,多半是ffmpeg的问题

如果报错中出现imageio 和 ffmpeg 的字样&#xff0c;去装requirement也没啥用 这里最好到cmd中&#xff0c;进入comfyui的python环境&#xff0c;运行以下两句&#xff1a; import imageio imageio.plugins.ffmpeg.download() 图例&#xff1a; 如果节点不报错了&#xff0…

WHAT - CSS Animationtion 动画系列(四)- 移动端全屏动画

目录 一、背景1.1 GIF & Video1.2 存在的问题 二、技术方案2.1 使用CSS动画和JavaScript2.2 使用JavaScript库2.3 使用序列帧1. css animation 帧动画2. JavaScript requestAnimationFrame 帧动画 2.4 使用Canvas1. html 和 canvas 中的 video2. 基于Canvas的动画库 今天我…

【Linux】动态库与静态库的底层比较

送给大家一句话&#xff1a; 人生最遗憾的&#xff0c;莫过于&#xff0c;轻易地放弃了不该放弃的&#xff0c;固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…

lastb命令

列出登入系统失败的用户相关信息 补充说明 lastb命令 用于显示用户错误的登录列表&#xff0c;此指令可以发现系统的登录异常。单独执行lastb命令&#xff0c;它会读取位于/var/log目录下&#xff0c;名称为btmp的文件&#xff0c;并把该文件内容记录的登入失败的用户名单&am…

java项目之企业OA管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的企业OA管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 企业OA管理系统的主要使用…

Nios-II编程入门实验

文章目录 一 Verilog实现流水灯二 Nios实现流水灯2.1 创建项目2.2 SOPC添加模块2.3 SOPC输入输出连接2.4 Generate2.5 软件部分2.6 运行结果 三 Verilog实现串口3.1 代码3.2 引脚3.3 效果 四 Nios2实现串口4.1 sopc硬件设计4.2 top文件4.3 软件代码4.4 实现效果 五 参考资料六 …

Vue3 查看真实请求地址

上回说到Vue2查看真实请求地址&#xff0c;那么Vue3该如何查看呢&#xff1f; 传送门&#xff1a; Vue2 查看真实请求地址 1. bypass函数 使用bypass函数获取代理结果&#xff0c;设置响应头&#xff08;请求头设置未生效&#xff0c;也可以在响应头上看&#xff09;。 2. …

GoogleGemini-AI预测2024系统分析师案例分析

Message From You: 系统分析师是全国计算机职业资格与水平考试高级别的一类考试&#xff0c;结合历年的论文考试题目以及当前流行的系统分析方面的问题。你能否预测一些案例分析类的题目&#xff1f; Message From ChatGPT: 2024 年系统分析师案例分析题目预测 案例 1&…

软件全套资料梳理(需求、开发、实施、运维、安全、测试、交付、认证、评审、投标等)

软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c…

BGP学习一:关于对等体建立和状态组改变

目录 一.BGP基本概念 &#xff08;1&#xff09;.BGP即是协议也是分类 1.早期EGP 2.BGP满足不同需求 3.BGP区域间传输的优势 &#xff08;1&#xff09;安全性——只传递路由信息 &#xff08;2&#xff09;跨网段建立邻居 4.BGP总结 5.BGP的应用 &#xff08;1&#…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 02

Week 02 of Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Week 02 of Neural Networks and Deep LearningLearning Objectives [1] Logistic Regres…

Vue.js介绍

Vue.js 是一个用于构建用户界面的开源JavaScript框架&#xff0c;它由前谷歌工程师尤雨溪&#xff08;Evan You&#xff09;在2014年创建。Vue.js 以其简洁、灵活和易用性而闻名&#xff0c;特别适合用于构建复杂的单页面应用程序&#xff08;SPA&#xff09;。 以下是 Vue.js…

YOLOv8_seg预测流程-原理解析[实例分割理论篇]

YOLOv8_seg的网络结构图在博客YOLOv8网络结构介绍已经更新了,由网络结构图可以看到相对于目标检测网络,实例分割网络只是在Head层不相同,如下图所示,在每个特征层中增加了Mask层(浅紫色),这和同一层的Box,cls的shape大小一样;另外还利用8080尺度的特征图,经过卷积+上…