QT从入门到实战完整版 P32 P33 P34 P35

定时器1

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 idx1;//定时器1的唯一标识
    int idx2;//定时器2的唯一标识
private:
    Ui::Widget *ui;
};
#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);
    //启动定时器
    idx1=startTimer(1000);//参数1 间隔 单位 毫秒
    idx2=startTimer(2000);
}
void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId()==idx1)
    {
        static int num=1;//label2每隔1秒+1
        ui->label_2->setText(QString::number(num++));
    }
    if(ev->timerId()==idx2)
    {
        static int num2=1;//label3每隔2秒+1
        ui->label_3->setText(QString::number(num2++));
    }
}
Widget::~Widget()
{
    delete ui;
}

定时器2

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>//定时器类

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //启动定时器
    idx1=startTimer(1000);//参数1 间隔 单位 毫秒
    idx2=startTimer(2000);

    //定时器第二种方式
    QTimer * timer =new QTimer(this);
    //启动定时器
    timer->start(500);
    connect(timer,&QTimer::timeout,[=](){
        static int num=1;//label4每隔0.5秒+1
        ui->label_4->setText(QString::number(num++));
    });
    //点击暂停按钮 实现暂停
    connect(ui->btn,&QPushButton::clicked,[=](){
        timer->stop();
    });
}
void Widget::timerEvent(QTimerEvent *ev)
{
    if(ev->timerId()==idx1)
    {
        static int num=1;//label2每隔1秒+1
        ui->label_2->setText(QString::number(num++));
    }
    if(ev->timerId()==idx2)
    {
        static int num2=1;//label3每隔2秒+1
        ui->label_3->setText(QString::number(num2++));
    }
}
Widget::~Widget()
{
    delete ui;
}

event事件分发器

myLabel.h

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
#include <QWidget>

class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    //鼠标进入事件
    void enterEvent(QEnterEvent *event);
    //鼠标离开事件
    void leaveEvent(QEvent *ev);

    //鼠标按下
    virtual void mousePressEvent(QMouseEvent *ev);
    //鼠标释放
    virtual void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动
    virtual void mouseMoveEvent(QMouseEvent *ev);
    //通过event事件分发器 拦截 鼠标按下事件
    bool event(QEvent *e);


signals:

};

#endif // MYLABEL_H
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>

myLabel::myLabel(QWidget *parent)
    : QLabel{parent}
{
    //设置鼠标追踪状态
    setMouseTracking(true);
}
//鼠标进入事件
void myLabel::enterEvent(QEnterEvent *event)
{
    //qDebug()<<"鼠标进入了";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{
    //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;
    //}
}
bool myLabel::event(QEvent *e)
{
    //如果是鼠标按下 在event事件分发中做拦截操作
    if(e->type()==QEvent::MouseButtonPress)
    {
        QMouseEvent * ev=static_cast<QMouseEvent *>(e);
        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 QLabel::event(e);
}

事件过滤器

wedget.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 idx1;//定时器1的唯一标识
    int idx2;//定时器2的唯一标识
    //重写事件过滤器的事件
    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);
    //启动定时器
    idx1=startTimer(1000);//参数1 间隔 单位 毫秒
    idx2=startTimer(2000);

    //定时器第二种方式
    QTimer * timer =new QTimer(this);
    //启动定时器
    timer->start(500);
    connect(timer,&QTimer::timeout,[=](){
        static int num=1;//label4每隔0.5秒+1
        ui->label_4->setText(QString::number(num++));
    });
    //点击暂停按钮 实现暂停
    connect(ui->btn,&QPushButton::clicked,[=](){
        timer->stop();
    });
    //给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);
        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()==idx1)
    {
        static int num=1;//label2每隔1秒+1
        ui->label_2->setText(QString::number(num++));
    }
    if(ev->timerId()==idx2)
    {
        static int num2=1;//label3每隔2秒+1
        ui->label_3->setText(QString::number(num2++));
    }
}
Widget::~Widget()
{
    delete ui;
}
posted @ 2023-07-21 18:35  Vijurria  阅读(97)  评论(0编辑  收藏  举报