Descripción detallada de la arquitectura y los principios subyacentes de QObject de Qt

En primer lugar, ¿qué es el QObject de QT?

Qobject es una clase base en QT, es la clase principal de todos los objetos QT, proporciona algunas funciones básicas, como señales y ranuras, sistema de atributos, sistema de metaobjetos, etc. Si desea que su clase tenga estas funciones, debe hacer que su clase herede de Qobject y agregar la macro Q_OBJECT a la declaración de clase. De esta forma, moc puede generar código de metaobjetos para su clase, lo que permite que su clase obtenga su propia metainformación en tiempo de ejecución.

En código, se escribe de la siguiente manera:

 Introduzca Q_OBJECT, para que la clase de clase definida pueda heredar QObject, y luego pueda llamar a señales y ranuras (el mecanismo más utilizado).

Aquí está la explicación oficial detallada de Qobject

Una cosa a tener en cuenta aquí es que si desea utilizar QObject, debe introducir el archivo de encabezado

#include <QObject>

Solo de esta manera podemos usar algunas funciones de uso común con las que estamos familiarizados, connect(); desconectar(), etc.

Además, QObject es el núcleo del modelo de objetos Qt. La característica central del modelo es un mecanismo muy poderoso para la comunicación fluida de objetos llamados señales y ranuras. Puede usar connect() para conectar una señal a una ranura y desconectar() para destruir la conexión. Para evitar un ciclo de notificación sin fin, puede bloquear temporalmente las señales con blockSignals(). Funciones protegidas connectNotify() y desconectarNotify().

Además, como nuestro comúnmente utilizado

Q_INVOKABLE expone funciones de C++ a llamadas qml y Q_PROPERTY_AUTO define parámetros para llamadas qml, todo basado en QObject.

Se puede ver que Qobject es una clase principal importante para escribir QT. También hay un mecanismo de administración de memoria, que es un mecanismo para que los objetos tengan objetos secundarios, lo que permite que un objeto sea el padre de otro objeto. Cuando se destruye el objeto padre, se encarga de destruir a todos sus hijos. Esto asegura que no se abuse de la memoria y que se pueda liberar a tiempo.

Y el mecanismo de introspección (Introspección), que es un mecanismo para que los objetos se describan a sí mismos, permite que un objeto conozca su propio nombre de clase, relación de herencia, métodos, atributos y otra información. Puede usar la función metaObject() para obtener información de metaobjetos sobre un objeto. Puede usar  la funciónHeredes () para determinar si la clase de un objeto hereda de otra clase en la jerarquía de herencia QObject. Cuando se elimina un objeto, emite  la señal de destrucción (). Puede captar esta señal para evitar referencias colgantes a  QObjects  .

Qt implementa el mecanismo de introspección mediante el uso de meta objetos (Meta Object). Un metaobjeto es un objeto que almacena la metainformación de un objeto, que se puede obtener a través de la función QObject::metaObject(). Qt utiliza MOC (Compilador de metaobjetos) para generar código de metaobjetos. MOC es un preprocesador que escanea las clases que contienen la macro Q_OBJECT y genera el código de metaobjetos correspondiente. Los metaobjetos se pueden utilizar para implementar funciones como señales y ranuras, propiedades dinámicas y llamadas dinámicas.

Aquí, mencionemos el papel de las señales y las tragamonedas en detalle:

La señal y la ranura de Q es un mecanismo para la comunicación entre objetos, que puede realizar operaciones interactivas entre controles, como hacer clic en un botón para cerrar la ventana. Las señales y las ranuras son una interfaz de alto nivel que puede transportar cualquier número y tipo de parámetros. Las señales y las ranuras son mecanismos de transmisión de mensajes específicos de Q, que deben manejarse correctamente con la ayuda de una herramienta QT llamada moc.
La señal se debe a que el usuario ha realizado ciertas operaciones en la ventana o el control, lo que hace que la ventana o el control generen un determinado evento.En este momento, la clase de ventana correspondiente a Q enviará una determinada señal para responder a la operación del usuario. La forma de presentación de la señal es una función, es decir, cuando ocurre un evento, el marco Qt llamará a una función de señal correspondiente para notificar al usuario.
Las ranuras son una clase especial de funciones funcionales, se pueden usar como funciones miembro ordinarias de una clase y también pueden procesar señales generadas en el cuadro Q. Cuando se detecta que un determinado objeto envía una determinada señal, se llamará a la función de ranura conectada a él para manejar la señal. La función de ranura es esencialmente una función de devolución de llamada. El momento de la llamada es después de que se genera la señal y el marco Qt ejecuta la llamada.
Las señales y las ranuras se pueden conectar a través de la función de conexión en la clase Qobject para realizar el enlace. La función de conexión debe especificar el objeto que envía la señal, la dirección de la función de señal, el objeto que recibe la señal y la dirección de la función de ranura. La función de conexión es equivalente a la señal de registro y la ranura que ha realizado acciones de procesamiento de señal. Es un mecanismo débilmente acoplado. El objeto que envía la señal no sabe ni le importa quién es el objeto que recibe la señal, y el objeto que recibe la señal no sabe ni se preocupa por la señal que envía. De quién es el objeto. Siempre que las firmas de las señales y las ranuras coincidan, se pueden conectar. El sistema de metaobjetos de Q garantiza el funcionamiento normal del mecanismo de señal y ranura.

Aquí hay un ejemplo simple sobre las señales y las ranuras de QT

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}

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

Un ejemplo simple sería crear un botón que cierre la ventana al hacer clic. Primero, debe agregar un botón a la interfaz de usuario, llamado closeBtn. Luego, en el archivo Mainwindow.cpp, use la función de conexión para conectar la señal de clic del botón con la función de cierre de ranura de la ventana. De esta forma, cuando el usuario haga clic en el botón, se activará la función de cierre de la ventana para cerrar la ventana.

Otro ejemplo, suponiendo que tenemos una clase Person heredada de QObject, que tiene dos propiedades, nombre y género, podemos usar la macro Q_PROPERTY para declarar estas dos propiedades y usar la macro Q_ENUM para declarar el tipo de enumeración de género. De esta forma, MOC generará un metaobjeto para esta clase, y podremos obtener la metainformación de esta clase a través del metaobjeto, como por ejemplo:

  • Utilice la función metaObject()->className() para obtener el nombre de la clase y devolver "Persona".
  • Utilice la función metaObject()->propertyCount() para obtener el número de propiedades y devolver 2.
  • Use la función metaObject()->property(0) para obtener la meta propiedad (QMetaProperty) de la primera propiedad, luego use la función name() para obtener el nombre de la propiedad y devuelva "name".
  • Utilice la función metaObject()->enumeratorCount() para obtener el número de tipos de enumeración y devolver 1.
  • Utilice la función metaObject()->enumerator(0) para obtener la metaenumeración (QMetaEnum) del primer tipo de enumeración y, a continuación, utilice la función keyCount() para obtener la cantidad de valores de enumeración y devolver 4.

Y también podemos usar QObject para recibir eventos a través de  event () para filtrar eventos de otros objetos. Consulte  installEventFilter () y  eventFilter () para obtener más información. Se puede volver a implementar un manejador conveniente  childEvent () para capturar eventos secundarios. Los eventos se entregan en el subproceso en el que se creó el objeto; consulte  Compatibilidad con Qt y subprocesos en subproceso ()  para obtener más detalles . Tenga en cuenta que para QObjects sin dependencias de subprocesos  ( subproceso () devuelve cero), no se realiza ningún manejo de eventos.

Use  la función moveToThread () para cambiar la afinidad de subprocesos de un objeto y sus hijos (un objeto no se puede mover si tiene un padre). Finalmente, vale la pena mencionar que QObject también proporciona soporte de temporizador básico en Qt;

Supongo que te gusta

Origin blog.csdn.net/Helloorld_1/article/details/131894118
Recomendado
Clasificación