Qt事件&定时器

目录

1、鼠标事件

1、需要知道有哪些鼠标事件

2、需要知道QLabel控件的鼠标事件的处理函数

3、编写QLabel控件的鼠标事件的处理函数

2、定时器实现方法

1、定时器事件

2、定时器类QTimer

3、event事件分发器

4、event事件过滤器


一、鼠标事件

以 QLabel 控件的鼠标事件为例:

1、需要知道有哪些鼠标事件

enum QEvent::Type

2、需要知道QLabel控件的鼠标事件的处理函数

3、编写QLabel控件的鼠标事件的处理函数

获取x y坐标:ev->x() ev->y()

格式化字符串:QString("%1, %2").arg(111).arg(222)

判断所有按键:ev->button(),按键键值如下

重点内容:

QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
if (ev->button() == Qt::LeftButton) //左键按下判断
{
    QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
    qDebug() <<str.toUtf8().data();
}

全部内容:

#include <QLabel>
#include <QEvent>
#include <QMouseEvent>

class mylabel : public QLabel
{
    Q_OBJECT
public:
    explicit mylabel(QWidget *parent = 0);

    virtual void enterEvent(QEvent *event);//鼠标进入事件 虚函数重写
    virtual void leaveEvent(QEvent *event);//鼠标离开事件 虚函数重写
    virtual void mouseMoveEvent(QMouseEvent * ev);//鼠标移动事件 虚函数重写
    virtual void mousePressEvent(QMouseEvent * ev);//鼠标按下事件 虚函数重写
    virtual void mouseReleaseEvent(QMouseEvent * ev);//鼠标释放事件 虚函数重写

signals:

public slots:
};
#include "mylabel.h"
#include "QDebug"
#include "QString"

mylabel::mylabel(QWidget *parent) : QLabel(parent)
{}
//鼠标进入事件
void mylabel::enterEvent(QEvent *event)
{qDebug() <<"鼠标进入";}

//鼠标离开事件
void mylabel::leaveEvent(QEvent *event)
{ qDebug() <<"鼠标离开";}

//鼠标移动事件 虚函数重写
void mylabel::mouseMoveEvent(QMouseEvent * ev)
{qDebug() <<"鼠标移动";}

//鼠标按下事件 虚函数重写
void mylabel::mousePressEvent(QMouseEvent * ev)
{
    if (ev->button() == Qt::LeftButton) {//左键按下判断
        //格式化字符串
        QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug() <<str.toUtf8().data();}
}
//鼠标释放事件 虚函数重写
void mylabel::mouseReleaseEvent(QMouseEvent * ev)
{qDebug() <<"鼠标释放";}

二、定时器实现方法

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{
    ui->setupUi(this);
    //定时器的第一种方法:通过定时器事件和重写定时器处理函数
    //启动定时器,周期单位ms
    //timer1_id = startTimer(1000);
    //timer2_id = startTimer(10000);

    //定时器的第二种方法:通过定时器类
    QTimer *timer = new QTimer(this);
    timer->start(500);
    connect(timer, &QTimer::timeout, [=](){
        static int num = 1;
        ui->label->setNum(num++);
    });
    //通过点击按钮停止定时器
    connect(ui->btn_stop, &QPushButton::clicked, [=](){
        if (timer->isActive())
            timer->stop();
        else
            timer->start(500);
    });
}

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

//定时器的第一种方法:重写定时器事件处理函数
void Widget::timerEvent(QTimerEvent *ev)
{
    static int num = 1;

    if (ev->timerId() == timer1_id){
        ui->label->setNum(num++);
    } else if (ev->timerId() == timer2_id){
        num = 1;
    }
}

1、定时器事件

1、 QEvent::Timer 事件

2、QEvent::Timer 事件的处理函数是 void timerEvent(QTimerEvent *ev)

3、启动定时器 startTimer(1000) 毫秒,返回定时器的唯一标识ID

4、有多个定时器时,可以对比startTimer()返回的定时器ID 和 通过 QTimerEvent->timerid() 获取的QTimerEvent事件中的定时器ID,该ID就是startTimer()返回的定时器ID

2、定时器类QTimer

1、创建定时器 QTimer *timer = new QTimer(this);

2、启动定时器 timer->start(500);

3、通过 timeout 信号,绑定信号和槽

三、event事件分发器

bool QObject::event(QEvent *e) 事件分发器,可以在QObject的派生类中重写该虚函数,自定义事件的分发,实际开发中不建议这样做!!https://www.cnblogs.com/zhaobinyouth/p/7688954.html

 //重写event事件分发器,拦截鼠标按下事件,实际工程并不会拦截!!!!!
 bool mylabel::event(QEvent *e)
 {
    //自己处理按钮 按下事件
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *ev = dynamic_cast<QMouseEvent *>(e);//类型转换,将父类对象转为子类对象
        QString str = QString("Event函数中,鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
        qDebug() <<str.toUtf8().data();

        return true;//表示该事件已经被处理了,true代表用户自己处理这个事件 不向下分发
    }

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

四、event事件过滤器

在程序将事件分发到事件分发器前,可以利用过滤器做拦截

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/108439133