QT学习笔记之事件

苦难是没有任何意义的,不然流浪汉就是伟人了;失败也不会孕育成功,导致抑郁还差不多。


1.鼠标事件

在ui界面添加一个QLabel控件Label,并将其提升为myqlabel类。

鼠标进入事件 enterEvent
鼠标离开事件 leaveEvent
鼠标按下 mousePressEvent( QMouseEvent event)
鼠标释放mouseReleaseEvent
鼠标移动mouseMoveEvent
event>x( ) x坐标 event>y( ) y坐标
event->button( )可以判断所有按键 Qt::leftButton Qt::RightButton
event->buttons( )判断组合按键 判断 move 时候的鼠标左右键是否按下  结合 & 操作符
格式化字符串 QString(“%1 %2 ").arg(111 ).arg(222)
设置鼠标追踪 setMouseTracking(true)

myqlabel.h文件

#ifndef MYQLABEL_H
#define MYQLABEL_H

#include <QLabel>
#include <QMouseEvent>
class myQLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myQLabel(QWidget *parent = nullptr);
    void enterEvent(QEnterEvent *event);
    void leaveEvent(QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    bool event(QEvent *e);//用于事件分发,也可用于事件拦截
signals:
};

#endif // MYQLABEL_H

myqlabel.cpp文件

#include "myqlabel.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
#include <QString>
myQLabel::myQLabel(QWidget *parent)
    : QLabel{parent}
{
    //设置鼠标的追踪状态
    setMouseTracking(true);
};

void myQLabel::enterEvent(QEnterEvent *event)
{
    qDebug()<<"鼠标进去了";
};//鼠标进入事件
void myQLabel::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开了";
};//鼠标离开事件
void  myQLabel::mousePressEvent(QMouseEvent *event)
{
    if(event->button() ==Qt::LeftButton)//button判断鼠标左右按键
    {
        QString str =QString("鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
        qDebug()<<str;
    }

};//鼠标按下

void myQLabel::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() ==Qt::LeftButton)
    {
    QString str =QString("鼠标释放了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
    qDebug()<<str;
    }
};//鼠标释放

void myQLabel::mouseMoveEvent(QMouseEvent *event)
{
    // if(event->buttons() & Qt::LeftButton)//移动是个持续的过程,与按下和释放不同,移动过程中存在左键右键全部按下的状况。所以判断方式不同,所以需要用联合状态buttons来判断,(左键LeftButton值为0x00000001)要求联合状态值为真
    // {
     QString str =QString("鼠标移动了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
     qDebug()<<str;
    // }
};//鼠标移动

bool myQLabel::event(QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *event = static_cast<QMouseEvent *>(e);//对Event强制类型转化为mouseEvent
        QString str =QString("event事件中鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
        qDebug()<<str;
        return true;//true代表用户自己处理这个事件,不向下分发
    }

    return QLabel::event(e);//其他事件交给父类处理
}

2.定时器

ui界面添加三个QLabel控件Label1、Label2、Label3以及一个按钮。

1)定时器 1
利用事件 void timerevent(QTimerEvent* ev)
启动定时器 startTimer(1000) 毫秒单位
timerevent 的返回值是定时器的唯一标示 ,可以和 event->timerld 做比较
2)定时器 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;
    int id2;
    bool eventFilter(QObject *,QEvent *);//重写事件过滤器事件

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
   id1=startTimer(1000);//启动定时器,并接收返回值,startTimer返回值是定时器是唯一标识。单位是毫秒
   id2=startTimer(2000);

   QTimer *timer =new QTimer(this);//创建定时器对象
   timer->start(500);//启动定时器,毫秒
   connect(timer,&QTimer::timeout,[=](){
       static int num3 =1;//提升作用域,防止每次调用都从1开始,数值不变化
       ui->Label3->setText(QString::number(num3++));
   });//第二种定时器的实现方式,推荐

   connect(ui->btn,&QPushButton::clicked,[=](){
       timer->stop();
   });//点击暂停按钮,停止定时器

   ui->Label1->installEventFilter(this);//给Label1安装事件过滤器

}

void Widget::timerEvent(QTimerEvent *ev)
{

    if(ev->timerId()== id1)
    {
        static int num1 =1;//提升作用域,防止每次调用都从1开始,数值不变化
        ui->Label1->setText(QString::number(num1++));
    }

    if(ev->timerId()== id2)
    {
        static int num2 =1;//不同定时器之间通过startTimer返回值来区分
        ui->Label2->setText(QString::number(num2++));
    }
}//利用事件实现定时器

bool Widget::eventFilter(QObject *obj,QEvent *e)
{
    if(obj ==ui->Label1)
    {
        if(e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *event = static_cast<QMouseEvent *>(e);//对Event强制类型转化为mouseEvent
            QString str =QString("事件过滤器中鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
            qDebug()<<str;
            return true;//true代表用户自己处理这个事件,不向下分发
        }
    }
    return QWidget::eventFilter(obj,e);
}
Widget::~Widget()
{
    delete ui;
}

3.事件分发

对于app传输的事件,首先会进行事件分发bool event(QEvent *ev),返回值是布尔类型,如果返回值为真,代表用户需要处理这个事件,则不会将事件继续分发到对应的事件处理函数,event事件也可用于事件拦截,但是不建议使用。

4.事件过滤

事件过滤位于事件分发前,在程序将事件分发到事件分发器前,可以使用事件过滤器进行拦截。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值