Qt event system: procesamiento y entrega de eventos en Qt

1. Introducción

En Qt, un evento es un objeto que hereda de la clase QEvent. Los más comunes incluyen el evento de teclado QKeyEvent, el evento de mouse QMouseEvent y el evento de temporizador QTimerEvent, etc. El diagrama de relación de herencia con la clase QEvent se muestra a continuación. Este capítulo explicará en detalle estos tres eventos comunes y también incluirá el conocimiento de los filtros de eventos y los eventos personalizados. Para el contenido relevante de este capítulo, puede verlo a través de la palabra clave The Event System en la ayuda de Qt.

 

2. Eventos en Qt

Un evento es un término general para eventos o acciones que son generados interna o externamente por varias aplicaciones que necesitan ser conocidas. Un objeto se usa en Qt para representar un evento, heredado de la clase QEvent.

Cabe señalar que los eventos no son lo mismo que las señales, por ejemplo, si hace clic en un botón en la interfaz, se generará el evento del mouse QMouseEvent (no generado por el botón), y debido a que se presiona el botón, enviará out clicked() Señal de clic (generada por el botón). En general, aquí solo se trata de la señal de clic del botón, y el evento del mouse no se considera, pero si desea diseñar un botón o hacer que produzca otros efectos cuando se hace clic en el botón, entonces debe preocuparse por el evento del mouse . Se puede ver que los eventos y las señales son dos niveles diferentes de cosas, con diferentes remitentes y diferentes funciones. En Qt, cualquier instancia de la subclase QObject puede recibir y procesar eventos.

2.1 Procesamiento de eventos

Un evento está representado por una subclase QEvent específica, pero a veces un evento contiene varios tipos de eventos.Por ejemplo, los eventos del mouse se pueden dividir en varias operaciones, como presionar el mouse, hacer doble clic y mover. Estos tipos de eventos están representados por el tipo de enumeración QEvent::Type de la clase QEvent, que contiene más de cien tipos de eventos, que se pueden ver en el documento de ayuda de la clase QEvent. Aunque una subclase de QEvent puede representar un evento, no se puede usar para manejar un evento, entonces, ¿cómo se debe manejar un evento? En la documentación de ayuda de la función de notificación () de la clase QCoreApplication, se proporcionan cinco métodos para manejar eventos:

  • Método 1: Vuelva a implementar funciones de procesamiento de eventos como paintEvent() y mousePressEvent() del componente. Este es el método más utilizado, pero solo se puede usar para manejar eventos específicos de componentes específicos.
  • Método 2: Vuelva a implementar la función de notificación(). Esta función es poderosa y proporciona un control completo para obtener eventos antes de que los obtenga el filtro de eventos. Sin embargo, solo puede manejar un evento a la vez.
  • Método 3: Instale un filtro de eventos en el objeto QApplication. Debido a que un programa tiene solo un objeto QApplication, la función realizada de esta manera es la misma que usar la función de notificación (), y la ventaja es que se pueden procesar múltiples eventos al mismo tiempo.
  • Método 4: Vuelva a implementar la función event(). La función event() de la clase QObject puede obtener el evento antes de que llegue al controlador de eventos predeterminado.
  • Método cinco: Instale un filtro de eventos en el objeto. Los filtros de eventos se pueden usar para manejar diferentes eventos de diferentes subcomponentes en una clase de interfaz al mismo tiempo.

En la programación real, el método uno es el más utilizado, seguido del método cinco. Porque el segundo método necesita heredar de la clase QApplication y el tercer método necesita usar un filtro de eventos global, lo que ralentizará la transmisión de eventos, por lo que aunque estos dos métodos son muy poderosos, rara vez se usan.

Los beneficios de este artículo, gratis para recibir el paquete de materiales de aprendizaje de desarrollo Qt, video técnico, que incluye (base del lenguaje C ++, introducción a la programación Qt, mecanismo de señal y ranura QT, dibujo de imagen de desarrollo de interfaz QT, red QT, programación de base de datos QT, QT proyecto de combate, QSS, OpenCV, módulo rápido, preguntas de la entrevista, etc.) ↓↓↓↓↓↓Ver abajo↓↓Haga clic en la parte inferior del artículo para recibir la tarifa↓↓

2.2 Entrega de eventos

Al final de la función main() de cada programa, se llamará a la función exec() de la clase QApplication, que hará que la aplicación Qt entre en el bucle de eventos, para que la aplicación pueda recibir varios eventos que ocurren durante el tiempo de ejecución. Una vez que ocurre un evento, Qt construirá un objeto de subclase QEvent correspondiente para representarlo y luego lo pasará al objeto QObject correspondiente o sus subobjetos. Echemos un vistazo al proceso de entrega de eventos en Qt a través de un ejemplo .

Cree una nueva aplicación Qt Gui, el nombre del proyecto es myEvent, la clase base es QWidget y el nombre de la clase sigue siendo Widget. Después de completar el establecimiento, agregue un nuevo archivo al proyecto, seleccione la clase C++ como plantilla, el nombre de la clase es MyLineEdit, complete manualmente la clase base como QLineEdit y personalice una clase MyLineEdit.

archivo mylineEdit.h:

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>

class MyLineEdit : public QLineEdit
{
    Q_OBJECT
public:
    explicit MyLineEdit(QWidget *parent = nullptr);
    
    // event()函数获取事件的类型
	bool event(QEvent *event);    

protected:
    // MyLineEdit类的键盘按下事件
    void keyPressEvent(QKeyEvent *event);
};

#endif // MYLINEEDIT_H

Las declaraciones de la función keyPressEvent() y la función event() se agregan aquí.

archivo mylineEdit.cpp:

#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>

MyLineEdit::MyLineEdit(QWidget *parent) :
    QLineEdit(parent)
{

}

// MyLineEdit类的键盘按下事件
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    qDebug() << tr("MyLineEdit键盘按下事件");
    // 让MyLineEdit输入栏能输入字符
    QLineEdit::keyPressEvent(event);          // 执行QLineEdit类的默认事件处理
    event->ignore();                          // 忽略该事件
}

//event()函数获取事件的类型
bool MyLineEdit::event(QEvent *event)  
{
    // 判断触发事件类型是否为键盘按下事件
    if(event->type() == QEvent::KeyPress)
        qDebug() << tr("MyLineEdit的event()函数");
    return QLineEdit::event(event);   // 执行QLineEdit类event()函数的默认操作
}

Aquí, se personaliza una clase MyLineEdit, que hereda de QWidget, e implementa la función keyPressEvent() y la función event() de la clase MyLineEdit. La función event() usa event->type() para obtener el tipo de evento. Si se trata de un evento de pulsación de teclado QEvent::KeyPress, generará información y devolverá el resultado de la operación de la función event() de la clase principal.

archivo widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class MyLineEdit;
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

	// Widget类的事件过滤器
    bool eventFilter(QObject *obj, QEvent *event);    

private:
    Ui::Widget *ui;
    MyLineEdit *lineEdit;

protected:
    // Widget类的键盘按下事件
    void keyPressEvent(QKeyEvent *event);
};

#endif // WIDGET_H

La declaración de la función keyPressEvent() también se agrega aquí.

archivo widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
        
    lineEdit = new MyLineEdit(this);
    lineEdit->move(100, 100);
}

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

// Widget类的键盘按下事件
void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug() << tr("Widget键盘按下事件");
}

// Widget类的事件过滤器
bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
{
    // 如果是lineEdit部件上的事件
    if(obj == lineEdit)
    {              
        if(event->type() == QEvent::KeyPress)
            qDebug() << tr("Widget的事件过滤器");
    }
    return QWidget::eventFilter(obj, event);
}

La función keyPressEvent() de la clase Widget también se implementa aquí y se llamará a la función keyPressEvent() de la clase MyLineEdit. En el filtro de eventos, primero juzgue si el objeto del evento es lineEdit, si es así, luego juzgue el tipo de evento y finalmente devuelva el resultado de ejecución del filtro de eventos predeterminado de la clase QWidget.

Ejecute el programa y luego presione cualquier tecla en el teclado, por ejemplo, presione la tecla a aquí, el resultado de la ejecución se muestra en la figura a continuación.

 

Se puede ver que el orden de entrega de eventos es el siguiente: primero el filtro de eventos, luego la función event() del componente de enfoque y, finalmente, el controlador de eventos del componente de enfoque, como la función de evento de pulsación de teclado aquí; si el componente de enfoque ignora el evento, luego se ejecutará la función de procesamiento de eventos del componente principal, como se muestra en la figura anterior. Tenga en cuenta que la función event() y la función de procesamiento de eventos se redefinen dentro del componente, mientras que el filtro de eventos se define en el componente principal del componente.

Los beneficios de este artículo, gratis para recibir el paquete de materiales de aprendizaje de desarrollo Qt, video técnico, que incluye (base del lenguaje C ++, introducción a la programación Qt, mecanismo de señal y ranura QT, dibujo de imagen de desarrollo de interfaz QT, red QT, programación de base de datos QT, QT proyecto de combate, QSS, OpenCV, módulo rápido, preguntas de la entrevista, etc.) ↓↓↓↓↓↓Ver abajo↓↓Haga clic en la parte inferior del artículo para recibir la tarifa↓↓ 

Supongo que te gusta

Origin blog.csdn.net/QtCompany/article/details/131743397
Recomendado
Clasificación