Un tutorial minimalista para comenzar con Qt (3)

"Eventos del mouse en Qt"

Evento abreviado como QEvent
hace algo de construcción, destrucción y captura para algunos controles. Luego, debe crear algunos controles personalizados basados ​​en los controles existentes.


Mouse enter event: enterEvent (QEvent * event);
mouse leave event: leaveEvent (QEvent * event);
palabra clave virtual, lo que significa que la función miembro se puede anular en la subclase.

Casos de uso:

PD: Arrastre y suelte el tipo de control de etiqueta en la interfaz de IU, haga clic con el botón derecho en " Promocionar a ... " myLabel tipo personalizado

/*
    自定义空间类
    实现鼠标进入/离开事件的捕捉。
*/
class myLabel : public QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);

    /* 重写进入和离开事件 */
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);
signals:

public slots:
};

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{

}

void myLabel::enterEvent(QEvent *event) {
    qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
    qDebug()<<"鼠标离开...";
}

Funciones protegidas reimplementadas

También hay funciones miembro disponibles para reimplementación en la clase QLabel, como se muestra en la siguiente tabla

Mouse hacia abajo: mousePressEvent (QMouseEvent * EV)
movimiento del mouse:. MouseMoveEvent (QMouseEvent * EV)
Mouse hacia arriba: mouseReleaseEvent (EV QMouseEvent *)

Código

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

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

    /* 鼠标的移动、按下、释放 事件 */
    virtual void mouseMoveEvent(QMouseEvent *ev);
    virtual void mousePressEvent(QMouseEvent *ev);
    virtual void mouseReleaseEvent(QMouseEvent *ev);

signals:

public slots:
};

myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    // 设置鼠标追踪 默认为false
    // 鼠标不需要按下,即可打印坐标
    setMouseTracking(true);
}

void myLabel::enterEvent(QEvent *event) {
    qDebug()<<"鼠标进入...";
}
void myLabel::leaveEvent(QEvent *event) {
    qDebug()<<"鼠标离开...";
}

void myLabel::mouseMoveEvent(QMouseEvent *ev) {
    /* 参数:QMouseEvent *ev
       能捕获到所有鼠标按下、点击、释放等信息。详情可查表
    */
    // Qt中的格式化字符串
    if (ev->buttons() & Qt::LeftButton) {
        QString str = QString("鼠标移动 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
    }

}
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;
    }
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
    QString str = QString("鼠标释放 x=%1, y=%2 ").arg(ev->x()).arg(ev->y());
    qDebug()<<str;
}

"Temporizador 1-Evento"

Evento de temporizador: timerEvent

Pasos para iniciar el evento del temporizador:

  1. Reescribir temporizador de eventos timerEvent (QTimerEvent * e)
  2. Iniciar el temporizador startTimer (1000)

Actualización de muestra:

Requisitos: +1 cada 2 segundos.

Tenga en cuenta que en la línea 19 del cofre superior, la clase QTimerEvent tiene una función miembro timeId en la clase, que representa el ID del temporizador pasado por el temporizador externo

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    // 重写定时器事件
    void timerEvent(QTimerEvent *e);
    // 定时器ID
    int id1;
    int id2;

private:
    Ui::Widget *ui;
};

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

    // 启动定时器
    id1 = startTimer(1000); //参数1 间隔  单位  毫秒

    id2 = startTimer(2000);
}

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

void Widget::timerEvent(QTimerEvent *e) {
    if (e->timerId() == id1) {
        static int num = 1;
        // label 每个1秒+1
        ui->label->setText(QString::number(num++));
    }
    if (e->timerId() == id2) {
        static int num = 1;
        // label_2 每隔2秒+1
        ui->label_2->setText(QString::number(num++));
    }
}

"Temporizador de 2 clases"

  1. Utilice la clase de temporizador QTimer
  2. Crear objeto de temporizador QTimer * timer = new QTimer (este)
  3. Iniciar el temporizador timer-> start ();
  4. Cada cierto milisegundo, envíe una señal (tiempo de espera) para monitorear
  5. Pausar el temporizador timer-> stop ();

Compare el evento del temporizador. El objeto de tipo temporizador tiene una única función, es decir, un temporizador es responsable del inicio y la parada de una función.
Para los eventos de temporizador, todos los eventos de respuesta del temporizador se colocan en la función de activación del temporizador timerEvent (QTimerEvent * e).

Prueba la castaña:

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

    // 定时器第二种方式
    QTimer *timer = new QTimer(this);
    // 启动定时器
    timer->start(500);// 每隔0.5秒,定时器对象发出一个信号出来.
    connect(timer, &QTimer::timeout, [=](){
        static int num = 1;
        // label 每隔0.5秒+1
        ui->label->setText(QString::number(num++));
    });

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

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44937328/article/details/114389388
Recomendado
Clasificación