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.hqwc.cn/news/692086.html

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

相关文章

【计算机毕业设计】基于微信小程序高校寻物平台

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于 微信小程序的高校寻物平台的开发全过程。通过分析基于微信小程序的高校寻物平台管理的不足&#xff0c;创建了一个计算机管理基于微信小程序的高校寻物平台的方案…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

京东页面(黏性定位的实现)

前言: 本文章将分享一些我这周在制作京东页面的实现部分,页面表面大体和京东页面差不多,在里面加了一点script,但是很容易理解,希望大家看到可以有所收获,如果我有哪部分写的不太好,欢迎大家来跟我交流! &#x1f970;个人主页:心.c &#x1f973;文章专题:京东页面制作 &#…

嵌入式C语言高级教程:实现基于STM32的环境监测系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 环境监测系统通过实时收集和分析环境数据&#xff0c;如温度…

小学拼音弄一下

import re from xpinyin import Pinyindef remove_middle_characters(text):# 仅保留汉字chinese_chars re.findall(r[\u4e00-\u9fff], text)cleaned_text .join(chinese_chars)# 如果字符数为偶数&#xff0c;则在中间添加空格if len(cleaned_text) % 2 0:middle_index le…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具&#xff0c;其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息&#xff0c;还能有效提高工作效率。然而&#xff0c;市场上很多便签应用仅限于单一平台使用&#xff0c;对于需要在手机和电脑间频繁切换…

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

苹果电脑MAC清理系统空间工具CleanMyMacX4.15.3中文版下载

苹果电脑以其出色的性能、优雅的设计和高效的操作系统而受到许多用户的喜爱。然而&#xff0c;随着时间的推移和使用量的增加&#xff0c;你可能会发现你的Mac开始变得缓慢和响应迟缓。这通常是因为硬盘空间被大量占用&#xff0c;影响了系统的整体性能。幸运的是&#xff0c;有…

线性集合:ArrayList,LinkedList,Vector/Stack

共同点&#xff1a;都是线性集合 ArrayList ArrayList 底层是基于数组实现的&#xff0c;并且实现了动态扩容&#xff08;当需要添加新元素时&#xff0c;如果 elementData 数组已满&#xff0c;则会自动扩容&#xff0c;新的容量将是原来的 1.5 倍&#xff09;&#xff0c;来…

day11-IO流

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

1905. 统计子岛屿

1905. 统计子岛屿 java&#xff1a;DFS class Solution {Boolean flag true;private void dfs(int x, int y, int m, int n, int[][] grid1, int[][] grid2) {if (x < 0 || x > m || y < 0 || y > n || grid2[x][y] ! 1) { // 包含关系&#xff1a;遍历最小范围…