事件【Qt】

文章目录

事件

event

label.cpp

#include "label.h"
#include<QDebug>
Label::Label( QWidget * parent)
    :QLabel(parent)
{

}

void Label::enterEvent(QEvent *event)
{
    //显式地忽略 event 参数,表示函数内部不会使用 event 参数,也不会对其进行任何操作
    (void  )event ;
    qDebug( ) << "enterEvent";

}
void Label::leaveEvent(QEvent *event)
{
    //显式地忽略 event 参数,表示函数内部不会使用 event 参数,也不会对其进行任何操作
     (void  )event ;
    qDebug( ) << "leaveEvent";

}

label.h

#ifndef LABEL_H
#define LABEL_H

#include <QWidget>
#include<QLabel>
class Label : public QLabel
{
public:
    Label(QWidget * parent);
    void enterEvent(QEvent* event);
    void leaveEvent(QEvent* event);
};

#endif // LABEL_H

必须要提升,否则不能构成多态

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

注意:提升的类的名称一定写对 ,如果出现报错 ,很有可能是类的名称不正确

1、通过事件获得鼠标点击的具体位置

2、 按下鼠标左键(右键),释放鼠标左键(右键)

3、实现鼠标双击的功能

clicked这样的信号,就相当于是一次鼠标按下事件和一次鼠标释放事件

label.h

#ifndef LABEL_H
#define LABEL_H

#include<QLabel>
class Label :public QLabel
{
public:
    Label(QWidget * parent);
     void mousePressEvent(QMouseEvent *event) ;
     void mouseReleaseEvent(QMouseEvent *event);
       void mouseDoubleClickEvent(QMouseEvent *event);
};

#endif // LABEL_H

label.cpp

#include "label.h"
#include<QDebug>
#include<QMouseEvent >
Label::Label(QWidget * parent)
        :QLabel(parent)
{

}


void Label::mousePressEvent(QMouseEvent *event) //鼠标左键和右键都可以触发
{
    if(event->button() == Qt::LeftButton)
    {
          qDebug() <<"按下左键" ;
    }

  else   if(event->button() == Qt::RightButton)
    {
          qDebug() <<"按下右键" ;
    }

    // 当前 event 对象就包含了鼠标点击位置的坐标.
    qDebug() << event->x() << ", " << event->y();

    // globalX 和 globalY 是以屏幕左上角为原点,获取的坐标.
    qDebug() << event->globalX() << ", " << event->globalY();


}


void Label::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        qDebug() << "释放左键";
    } else if (event->button() == Qt::RightButton) {
        qDebug() << "释放右键";
    }
}
void Label::mouseDoubleClickEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        qDebug() << "双击左键";
    } else if (event->button() == Qt::RightButton) {
        qDebug() << "双击右键";
    }
}

注意:写完代码后需要提升

在 Qt 中,鼠标移动事件(mouseMoveEvent)在默认情况下不会对鼠标移动进行追踪,这意味着当鼠标在窗口中移动时,不会自动触发 mouseMoveEvent。这样做是为了避免产生大量的事件,从而影响程序的性能和流畅性,尤其是在执行复杂逻辑时可能导致程序卡顿

Qt为了保证程序的流畅性,默认情况下不会对鼠标移动进行追踪.鼠标移动的时候不会调用mouseMoveEvent.除非显式告诉Qt就要追踪鼠标位置.

如何显式告诉Qt就要追踪鼠标位置?

#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
#include<QMouseEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //显示追踪鼠标的移动位置
    this->setMouseTracking(true);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << event->x() << ", " << event->y();
}

实现鼠标滚轮的滚动动作.

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 wheelEvent(QWheelEvent *event);
private:
    Ui::Widget *ui;
    int total ;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QWheelEvent>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    total =0 ;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::wheelEvent(QWheelEvent *event)
{
    total+= event->delta();
    qDebug() << total;
}

如何获取到用户的键盘按键?

QShortCut , 这是信号槽机制封装过,获取键盘按键的方式

keyPressEvent , 站在更底层的角度,也可以通过事件获取到当前用户键盘按下的情况.

1、获取单个按键

2、获取组合键

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 keyPressEvent(QKeyEvent *event);
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QKeyEvent>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::keyPressEvent(QKeyEvent *event)
{
//    qDebug() << event->key();

        //单个按键
    if(event->key() == Qt::Key_A)
    {
         qDebug() <<"A" ;
    }

            //组合键
            //Qt把这些用来搭配组合键的功能键,单独拎出来了
            //modifiers 是修饰符
    if(event->key() == Qt::Key_A && event->modifiers() == Qt::ControlModifier )
    {
         qDebug() <<"ctrl + A" ;
    }
}

QTimer实现了定时器功能.在QTimer背后是QTimerEvent定时器事件进行支撑的

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 *event);
private:
    Ui::Widget *ui;
    int timerId;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //开启定时器
    //timeId 是一个定时器的身份标识
  timerId =  this->startTimer(1000) ;
}

Widget::~Widget()
{
    delete ui;
}

void Widget::timerEvent(QTimerEvent *event)
{
    //如果一个程序中存在多个定时器(startTimer创建的定时器),此时每个定时器都会触发timerEvent函数.先判定一下这次触发是否是想要的定时器触发的,

    //不是我需要的定时器,直接忽略
    if(event->timerId() != this->timerId)
    {
        return ;
    }


     int value =  ui->lcdNumber->intValue();

     if(value  <= 0)
     {
         this->killTimer(this->timerId);
         return ;
     }
     value -=1;
    ui->lcdNumber->display(value) ;
}

moveEvent窗口移动时触发的事件

resizeEvent窗口大小改变时触发的事件

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 moveEvent(QMoveEvent *event)  ;
void resizeEvent(QResizeEvent *event)  ;
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QMoveEvent>
#include<QResizeEvent>
#include<QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::moveEvent(QMoveEvent *event)
{
    qDebug() << event->pos();
}

void Widget::resizeEvent(QResizeEvent *event)
{
    qDebug() << event->size();
}

事件分发/事件过滤属于Qt事件机制背后的一些逻辑.

事件分发 : 重写event 函数,直接获取到所有的事件 ,不当使用可能对现有的逻辑(现有的事件体系造成一些负面影响)

事件过滤: 有的场景中,比如要禁用用户的某种操作,可以考虑使用事件过滤机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鄃鳕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值