Eventos y temporizadores de Qt

Tabla de contenido

1. Eventos del mouse

1. Necesito saber qué son los eventos del mouse

2. Necesita conocer la función de procesamiento de eventos del mouse del control QLabel

3. Escriba la función de procesamiento de eventos del mouse del control QLabel

2. Método de implementación del temporizador

1. Evento con temporizador

2. Clase de temporizador QTimer

3. Despachador de eventos

4. Filtro de eventos de eventos


1. Eventos del mouse

Tome los eventos del mouse del control QLabel como ejemplo:

1. Necesito saber qué son los eventos del mouse

enumeración QEvent :: Type

2. Necesita conocer la función de procesamiento de eventos del mouse del control QLabel

3. Escriba la función de procesamiento de eventos del mouse del control QLabel

Obtener las coordenadas xy: ev-> x () ev-> y ()

Cadena de formato: QString ("% 1,% 2"). Arg (111) .arg (222)

Juzgar todas las claves: ev-> botón (), los valores clave de las claves son los siguientes

Contenido importante:

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();
}

todo el contenido:

#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() <<"鼠标释放";}

En segundo lugar, el método de implementación del temporizador

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. Evento con temporizador

1. QEvent :: Evento temporizador

2. La función de procesamiento de QEvent :: Timer event es void timerEvent (QTimerEvent * ev)

3. Inicie el temporizador startTimer (1000) milisegundos y devuelva la ID única del temporizador.

4. Cuando hay varios temporizadores, puede comparar el ID del temporizador devuelto por startTimer () con el ID del temporizador en el evento QTimerEvent obtenido a través de QTimerEvent-> timerid (). Este ID es el ID del temporizador devuelto por startTimer ()

2. Clase de temporizador QTimer

1. Cree un temporizador QTimer * timer = new QTimer (este);

2. Inicie el temporizador temporizador-> inicio (500);

3. Vincular señales y ranuras mediante señales de tiempo de espera

Tres, despachador de eventos

bool QObject :: event (QEvent * e) despachador de eventos, puede anular la función virtual en la clase derivada de QObject para personalizar la distribución de eventos. ¡Esto no se recomienda en el desarrollo real! ! 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);
 }

Cuatro, filtro de eventos de eventos

Antes de que el programa distribuya el evento al distribuidor de eventos, puede usar filtros para interceptar

 

Supongo que te gusta

Origin blog.csdn.net/m0_37845735/article/details/108439133
Recomendado
Clasificación