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_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函数(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秒+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;
}

输出如下所示:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统服务(22年国赛)—— Mail邮件服务部署

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 系统服务&#xff08;22年国赛&#xff09;—— Mail邮件服务部署https://myweb.myskillstree.cn/119.html 目录 题目 AppSrv&#xff08;已做好DNS配置&a…

Kotlin: ‘return‘ is not allowed here

报错&#xff1a;以下函数的内部函数return语句报错 Kotlin: return is not allowed here fun testReturn(summary: (String) -> String): String {var msg summary("summary收到参数")println("test内部调用参数&#xff1a;>结果是 &#xff1a;${msg…

Python多线程与互斥锁模拟抢购余票的示例

一、示例代码&#xff1a; from threading import Thread from threading import Lock import timen 100 # 共100张票def task():global nmutex.acquire() # 上锁temp ntime.sleep(0.1)n temp - 1print(购票成…

【计算机毕业设计】基于SSM++jsp的公司员工信息管理系统【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 目的和意义 1.3 论文结构安排 2 相关技术 2.1 SSM框架介绍 2.2 B/S结构介绍 2.3 Mysql数据库介绍 3 系统分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 运行可行性分析 3.2 系统性能分析 3.2.1 易用性指标 3.2.2 可…

大屏分辨率适配插件v-scale-screen

前言&#xff1a;大屏分辨率适配繁多&#xff0c;目前我认为最简单且问题最少的的方案就是使用v-scale-screen插件&#xff0c;无需考虑单位转换&#xff0c;position定位也正常使用。 1. 效果 填充满屏幕的效果 保持宽高比的效果 2. 插件原理 原理是通过css transfom 实现…

【计算机毕业设计】基于微信小程序的校园二手数码交易平台

随着 计算机技术的成熟&#xff0c;互联网的建立&#xff0c;如今&#xff0c;PC平台上有许多关于校园二手数码交易方面的应用程序&#xff0c;但由于使用时间和地点上的限制&#xff0c;用户在使用上存在着种种不方便&#xff0c;而开发一款基于微信小程序的校园二手数码交易平…

【计算机毕业设计】基于微信小程序的校园综合服务

随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园综合服务被用户普遍使用&#xff0c;为方便用户能够可以随时…

深度学习之GAN网络

目录 关于GAN网络 关于生成模型和判别模型 GAN网路的特性和搭建步骤&#xff08;以手写字体识别数据集为例&#xff09; 搭建步骤 特性 GAN的目标函数&#xff08;损失函数&#xff09; 目标函数原理 torch.nn.BCELoss&#xff08;实际应用的损失函数&#xff09; 代码…

IO:线程的同步互斥

一、引入 例&#xff1a; 要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件。 A线程循环打印buf字符串&#xff0c; B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321.…

创新指南|设计冲刺 – 更快找到成功的创新方案

“ 设计冲刺&#xff08;Design Sprint&#xff09;” 一词与跑步无关&#xff0c;而且不局限于设计&#xff0c;它与引导团队加速创新密切相关。设计冲刺旨在帮助创新团队在很短的时间内解决一个极有价值的问题。本文将深入解析这一法宝&#xff1a;设计冲刺是什么&#xff1f…

Electron | 桌面应用的开发神器

初探 Electron 教程将介绍 Electron 打包应用的全过程&#xff0c;从本地测试&#xff0c;打包&#xff0c;到 GitHub 自动化。讲解 Electron Forge 和 Electron Builder 的用法&#xff0c;以及如何在 GitHub Actions 中自动化生成和发布应用。 官方资源 Electron Document…

GDPU unity游戏开发 角色控制器与射线检测

在你的生活中&#xff0c;你一直扮演着你的角色&#xff0c;别被谁控制了。 小试 1. 创建一个角色控制器&#xff0c;通过键盘控制角色控制器的移动&#xff0c;角色控制器与家具发生碰撞后&#xff0c;通过Debug语句打印出被碰撞物体的信息(搜索OnControllerColliderHit的使用…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 &#xff0c;点击 启用或关闭Windows功能&#xff1a; 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序&#xff0c;如出现…

picoCTF-Web Exploitation-Most Cookies

Description Alright, enough of using my own encryption. Flask session cookies should be plenty secure! server.py http://mercury.picoctf.net:53700/ Hints How secure is a flask cookie? 我们先下载server.py&#xff0c;分析逻辑 from flask import Flask, render…

2024年,Web开发新趋势!

随着我们迈入新的一年&#xff0c;现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新&#xff0c;以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年&#xff0c;自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

绿盟之旅——一段安全实习结束

去年&#xff0c;因为着急找实习&#xff0c;拿着简历就开始海投&#xff0c;当时想的是有人让我去就谢天谢地了&#xff0c;第一个约我面试的就是绿盟&#xff0c;也很顺利的通过了面试&#xff0c;当时让我选择在上海还是北京&#xff0c;我选择的是上海&#xff0c;因为学校…

体验GM CHM Reader Pro,享受高效阅读

还在为CHM文档的阅读而烦恼吗&#xff1f;试试GM CHM Reader Pro for Mac吧&#xff01;它拥有强大的功能和出色的性能&#xff0c;能够让你轻松打开和阅读CHM文件&#xff0c;享受高效、舒适的阅读体验。无论是学习、工作还是娱乐&#xff0c;GM CHM Reader Pro都能成为你的得…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考&#xff1a; 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

OpenCompass 大模型评测实战学习笔记

大模型开源开放评测体系 “司南” (OpenCompass2.0)&#xff0c;用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下&#xff1a; 开源可复现&#xff1a;提供公平、公开、可复现的大模型评测方案 全面的能力维度&#xff1a;五大维度设计&#xff0c;提供 70…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列&#xff0c;具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务&#xff0c;支持各种接入方式和协议&#xff0c;并且可以方便地进行扩展和升级。 实验拓扑图&…