1. Tres mecanismos centrales de Qt
1. Ranura de señal
conectar (emisor de señal, señal, receptor de señal, ranura, modo de conexión (ocultar conexión automática predeterminada)) // cinco parámetros
2. ¿Sistema de metaobjetos? ? ?
El sistema de metaobjetos se divide en tres categorías: la clase QObject, la macro Q_OBJECT y el moc compilador de metaobjetos.
La clase Qt contiene el compilador moc macro Q_OBJECT compilará la clase en código C++ estándar
3. Modelo de evento
Emisor de eventos : inserta el evento en la cola de eventos;
Cola de eventos : como sugiere el nombre, sin explicación;
Bucle de eventos : es un bucle infinito, que se utiliza para obtener eventos de la cola de eventos y luego transferirlos a la función de procesamiento de eventos correspondiente para su procesamiento;
Función de procesamiento de eventos : una función llamada en respuesta a un evento, como un evento de clic con el botón izquierdo del mouse, qué acciones debe realizar la aplicación en respuesta, y estas acciones se definen en la función de procesamiento de eventos.
Tres mecanismos centrales del blog-CSDN de Qt_qt mecanismo_tomorrow778
En segundo lugar, ¿el principio del mecanismo de señal y ranura? ? ?
El proceso específico de señales y slots.
- moc busca señales y ranuras en el archivo de encabezado y marca las señales y las ranuras.
- Almacene la información de la ranura de señal en la variable estática de clase staticMetaObject, y guárdela en el orden de declaración, y cree un índice.
- Cuando se encuentra una conexión de conexión, la información de índice de la ranura de la señal se coloca en un mapa y se empareja entre sí.
- Cuando llame a emit, llame a la función de señal y pase el puntero de objeto de señal, el puntero de metaobjeto, el índice de señal, la lista de parámetros a la función activa
- Encuentre todos los índices de ranura correspondientes a la señal en el mapa a través de la función activa
- Encuentre la función de ranura de acuerdo con el índice de ranura y ejecute la función de ranura.
3. Precauciones para las ranuras de señales personalizadas:
(1) Tanto el emisor como el receptor deben ser subclases de QObject (excepto, por supuesto, cuando la función de ranura es una función global, la expresión Lambda, etc. no requiere un receptor);
(2) Use señales para marcar la función de la señal. Una señal es una declaración de función que devuelve un valor nulo y no necesita implementar el código de la función;
(3) La función de tragamonedas es una función de miembro ordinaria, como función de miembro, se verá afectada por público, privado y protegido;
(4) Usar emitir para enviar señales a lugares apropiados;
(5) Use la función QObject::connect() para conectar señales y ranuras;
(6) Cualquier función miembro, función estática, función global y expresión Lambda se puede utilizar como función de ranura.
4. Describa el mecanismo de ranura de la señal Qt y sus ventajas y desventajas.
ventaja:
① Escriba seguridad. Las firmas de los slots de señal que se deben asociar deben ser equivalentes. Es decir, el tipo de parámetro y el número de parámetros de la señal son los mismos que el tipo de parámetro y el número de parámetros de la ranura que recibe la señal. Si las firmas de la señal y la ranura son inconsistentes, el compilador informará un error.
② acoplamiento flojo. El mecanismo de señal y ranura debilita el acoplamiento de los objetos Qt. El objeto Qt que activa la señal no necesita saber qué ranura de señal de ese objeto recibe la señal que envía, solo necesita enviar la señal apropiada en el momento apropiado, y no necesita preocuparse si es aceptada y el objeto lo acepta. Qt luego se asegura de que se llame a la ranura adecuada, incluso si el objeto asociado se elimina en tiempo de ejecución. El programa no fallará.
③Flexibilidad. Una señal se puede asociar con varias ranuras, o se pueden asociar varias señales con la misma ranura.
Insuficiente: velocidad más lenta. En comparación con las funciones de devolución de llamada, el mecanismo de señales y ranuras se ejecuta 10 veces más lento que llamar directamente a funciones no virtuales.
5. ¿Cuál es la esencia de las señales y tragamonedas Qt?
Llamar de vuelta. Una señal transmite un valor o transmite un cambio de acción; una función de ranura responde a una señal o recibe un valor, o realiza una operación correspondiente de acuerdo con un cambio de acción.
6. Comparación de señales y ranuras con punteros de función
- Las funciones de devolución de llamada se implementan utilizando punteros de función.Si varias clases están preocupadas por los cambios dinámicos de una clase, es necesario escribir una lista relativamente larga para administrar la relación entre estas clases. Ligeramente menos flexible en la codificación, ligeramente redundante.
- QT usa señales y ranuras para resolver este problema de conexión. Este método es más claro y simple. Una clase solo necesita saber cuántas funciones de ranura y cuántas señales tiene, y luego conectar las señales a las ranuras. QT manejará las llamadas de función por sí mismo.relación. De esta forma, es más claro, más flexible y menos propenso a errores desde la perspectiva del diseño de software. 3. El mecanismo de señal y ranura Qt reduce el acoplamiento de los objetos Qt. El objeto que envía la señal no necesita saber cuántas funciones de slot hay, ni saber si ha recibido la señal, ni quién la ha recibido y quién no. La misma función de ranura no necesita saber quién es el emisor de la señal. La señal solo necesita enviarse en el momento adecuado, lo que reduce el acoplamiento entre objetos.
7. Varios usos de señales y tragamonedas
(1) Una señal se puede conectar a varias ranuras
Si este es el caso, las franjas horarias se llamarán una tras otra, pero el orden en que se llamarán no está definido.
(2) Se pueden conectar múltiples señales a una ranura
Este slot será llamado cada vez que se emita alguna señal.
(3) Una señal se puede conectar a otra señal
Cuando se emite la primera señal, se emite la segunda señal. Aparte de eso, no hay diferencia entre esta forma señal-señal y la forma señal-ranura.
(4) Las ranuras se pueden desvincular
Esta situación no ocurre muy a menudo, porque cuando se elimina un objeto, Qt cancela automáticamente todas las ranuras conectadas a este objeto.
(5) Usar expresiones lambda
Al usar Qt 5, todos los compiladores que admiten Qt 5 admiten expresiones Lambda.
8. Método de conexión de la función Qt connect
- Qt::AutoConnection: El valor predeterminado, utilizando este valor, el tipo de conexión se determinará cuando se envíe la señal. Si el receptor y el remitente están en el mismo subproceso, se utiliza automáticamente el tipo Qt::DirectConnection. Si el receptor y el remitente no están en el mismo hilo, se usa automáticamente el tipo Qt::QueuedConnection.
- Qt::DirectConnection: la función de ranura se llamará directamente cuando se envíe la señal, y la función de ranura y el remitente de la señal están en el mismo hilo. El efecto parece que la función de ranura se llama directamente en la ubicación de envío de la señal, y el efecto parece una llamada de función, ejecutada sincrónicamente. El código que sigue a la declaración de emisión no se ejecutará hasta que se hayan ejecutado todas las funciones de ranura asociadas con la señal.
- Qt::QueuedConnection: Después de enviar la señal, la señal se colocará temporalmente en una cola de mensajes.La señal debe obtenerse cuando el bucle de eventos del subproceso al que pertenece el objeto receptor obtiene el control, y luego la función de ranura asociada con la señal será ejecutada Este método es ambos Los mensajes se pueden pasar dentro del mismo hilo o entre hilos. El código después de la declaración de emisión se ejecutará inmediatamente después de que se emita la señal, sin esperar a que la función de ranura termine de ejecutarse.
- Qt::BlockingQueuedConnection: el tiempo de llamada de la función de ranura es el mismo que el de Qt::QueuedConnection, pero el subproceso donde se encuentra el remitente se bloqueará después de que se envíe la señal hasta que la función de ranura termine de ejecutarse. Y el receptor y el remitente no deben estar en el mismo hilo, de lo contrario, el programa se bloqueará. Esto puede ser necesario cuando se requiere sincronización entre varios subprocesos.
- Qt::UniqueConnection: este indicador se puede usar en combinación con los cuatro anteriores mediante bit a bit o (|). Cuando se establece este indicador, cuando una señal y una ranura ya están conectadas, fallarán las conexiones repetidas. Eso es para evitar conexiones repetidas.
Nueve, filtro de eventos Qt
- La clase de ventana principal escucha los eventos relacionados del control secundario anulando el método eventFilter para su procesamiento. La ventaja de utilizar este método es que no es necesario obtener ciertos eventos reescribiendo el control. Para los objetos con filtros de eventos instalados, todos sus eventos pasarán por este filtro de eventos, por lo que se pueden monitorear directamente en la ventana principal. .
- Una clase de filtro de eventos especiales que maneja objetos específicos/eventos específicos. La clase de filtro de eventos solo necesita procesar el objeto instalado actualmente y no necesita preocuparse por otras operaciones, y varios objetos pueden usar una clase de filtro de eventos.
- Instale un filtro de eventos para QApplication para lograr el efecto de monitoreo de eventos globales. Cuando el método de notificación envía un evento, el objeto QApplication puede obtener el primer control y dar prioridad a ciertos eventos, como operaciones de teclas de acceso directo globales.
punto importante:
- Los filtros de eventos se pueden instalar en cualquier objeto que herede QObject o en objetos QApplication (filtros de eventos globales);
- El valor de retorno del filtro de eventos (método eventFilter) es verdadero, lo que significa que el evento actual se filtrará y no se enviará al objeto en sí; si devuelve falso, significa que el evento actual no se procesará y el evento se distribuirá al padre a través del widget del método event(). Si no sabe cómo manejarlo o qué devolver, devuelva el método eventFilter de la clase principal (similar a return QObject::eventFilter(watched, event));
- Un objeto puede instalar múltiples filtros de eventos (es decir, los eventos de un objeto pueden ser monitoreados/procesados/filtrados por múltiples objetos), y el filtro de eventos instalado primero es el último en ser llamado, similar a la operación de la pila, avanzada atrás afuera;
- Varios objetos pueden instalar un filtro de eventos, pero si el objeto se elimina en el filtro de eventos (método eventFilter), el valor devuelto debe establecerse en verdadero. De lo contrario, Qt continuará distribuyendo eventos a este objeto, lo que provocará que el programa se bloquee.
En Qt, después de presionar un botón, el proceso de entrega de eventos generalmente involucra los siguientes pasos:
- El sistema operativo envía eventos de pulsación de teclas a la cola de eventos de la aplicación.
- El bucle de eventos de Qt obtiene eventos de pulsación de teclas de la cola de eventos.
- El bucle de eventos envía eventos clave a los filtros de eventos de la aplicación para su procesamiento. Si una aplicación configura filtros de eventos, los eventos se pueden interceptar y modificar antes de que lleguen al objeto de destino.
- Si el evento no es interceptado por el filtro, el bucle de eventos envía el evento al objeto de destino. El objeto de destino es el objeto que recibe el evento, generalmente un control en la interfaz de usuario, como un botón o un cuadro de texto.
- El objeto de destino realiza una acción según el tipo de evento, por ejemplo, un cuadro de texto puede agregar el carácter escrito al texto o un botón puede activar una señal.
- Si el objeto de destino no controla el evento, el evento se enviará al objeto principal del objeto de destino hasta que el evento se controle o llegue al objeto raíz de la aplicación.
- Si el evento llega al objeto raíz de la aplicación y no ha sido procesado, el evento será ignorado o descartado.
¿Sobre el valor de retorno de eventFilter?
La diferencia entre devolver un evento (QEvent*) de la clase base y devolver falso es cómo se maneja el evento. Devolver falso permitirá que el evento continúe entregándose de acuerdo con el proceso de entrega de eventos estándar, y devolver el evento de clase base (QEvent*) permitirá que el evento omita el proceso de entrega de eventos estándar y lo entregue a la función eventFilter de QAbstractNativeEventFilter para procesar. Debería devolver falso si el evento requiere un manejo de eventos estándar. Si el evento debe procesarse de una manera especial, puede considerar devolver el evento (QEvent*) de la clase base y realizar el procesamiento correspondiente en la función eventFilter.
Procesamiento de eventos de Qt y valor de retorno del blog de event filter_weixin_30596165-CSDN blog
Entrega de eventos de widgets padre-hijo en Qt - blog de imxiangzi - blog CSDN
10. Por qué no es necesario eliminar el nuevo QWidget
El mecanismo de objetos padre-hijo de QT (mecanismo de árbol de objetos) se implementa en QWidget y QOject. Cuando usamos el objeto principal para crear un objeto, el objeto principal agregará este objeto a su propia lista de objetos secundarios. Cuando se elimina el objeto principal, atraviesa su tabla de clases de objetos secundarios y elimina cada objeto secundario, y luego los propios objetos secundarios eliminan sus propios objetos secundarios, y así recursivamente hasta que se eliminan todos los objetos.
Este mecanismo de objeto padre-hijo simplificará en gran medida nuestro trabajo de administración de memoria y reducirá el riesgo de fugas de memoria. Los objetos que necesitamos borrar explícitamente (es decir, con delete ) son aquellos creados con new y no tienen padre. Si eliminamos un objeto antes de eliminar su padre, Qt lo eliminará automáticamente de la lista de hijos de su padre.
¿Cuándo se destruye el nuevo objeto de Qt_qt juzga que el nuevo objeto ha sido destruido_blog de wjjontheway-CSDN blog
En Qt, cuando se elimina un objeto principal, elimina automáticamente todos sus objetos secundarios, incluidos los objetos QWidget y otros. Al eliminar un objeto principal, Qt primero recorrerá su lista de objetos secundarios, eliminará recursivamente cada objeto secundario y luego eliminará el objeto principal en sí. Por lo tanto, elimine primero el objeto secundario y luego elimine el objeto principal.
11. La diferencia entre eventos y señales
Objeto de acción:
Se puede enviar una señal desde un objeto a cualquier objeto que se preocupe por la señal.
Los eventos solo se pueden enviar a objetos específicos.
Pasar datos:
las señales pueden transportar datos arbitrarios definidos por el usuario.
Los eventos solo pueden transportar datos predefinidos.
Orden:
La señal es síncrona, es decir, el emisor envía la señal y el receptor la recibe inmediatamente (mismo hilo).
Los eventos son asincrónicos y están esperando a ser procesados en la cola de eventos.
Escenario de uso:
las señales se utilizan para la comunicación entre objetos para notificar a otros objetos sobre cambios de estado.
Los eventos se utilizan para manejar eventos del sistema, como el mouse, el teclado y otros eventos de entrada.
Implementación:
La señal es el contenido de la señal y el mecanismo de ranura.
Los eventos se implementan en función de la clase QEvent.
Pros:
las señales brindan una comunicación más eficiente y conveniente entre los objetos.
Los eventos se pueden procesar en la cola de eventos sin bloquear la GUI.
12. Qt implementa subprocesos múltiples
Método 1: ①Cree una clase derivada de la clase QThread ②Reescriba la función de ejecución en la clase de subproceso, escriba la operación de procesamiento en la función ③Cree un objeto de subproceso en el subproceso principal, inicie el subproceso y llame al inicio () función
Método 2: ①Resumir el procesamiento comercial en una clase comercial, crear una función de procesamiento comercial en esta clase ②Crear un objeto de clase QThread en el subproceso principal ③Crear un objeto de clase comercial en el subproceso principal ④Mover el objeto de clase comercial al suben el subproceso ⑤Iniciar el subproceso secundario en el subproceso principal ⑥ Ejecute la función de procesamiento empresarial en la clase empresarial a través de la ranura de señal
Dos formas en que Qt implementa la programación multiproceso
Precauciones para el uso de subprocesos múltiples:
1. Para objetos comerciales, el objeto principal no se puede especificar al construir
2. Solo algunas operaciones relacionadas con datos se pueden procesar en el subproceso secundario y las ventanas no pueden estar involucradas
Trece, QT garantiza seguridad multihilo
QT proporciona algunos mecanismos para garantizar la seguridad de subprocesos, como mutex (QMutex), semáforo (QSemaphore) y bloqueo de lectura y escritura (QReadWriteLock). Estos mecanismos pueden realizar el acceso a datos sincrónicos y la coordinación entre subprocesos en un entorno de subprocesos múltiples.
14. ¿Cómo manejar la entrada del usuario y la respuesta de eventos en QT?
Qt proporciona un mecanismo de manejo de eventos para manejar la entrada del usuario y la respuesta a eventos. Al reescribir la función de procesamiento de eventos (como keyPressEvent, mousePressEvent, etc.), puede capturar la entrada del evento por parte del usuario y generar la respuesta correspondiente. Además, puede usar el mecanismo de señal y ranura para capturar y responder a acciones específicas del usuario, como clics en botones, ruedas del mouse, etc.
15. ¿Cómo diseñar y maquetar la interfaz y qué métodos comunes de maquetación hay en QT?
Ejemplo de respuesta: en QT, los administradores de diseño se pueden usar para ayudar con el diseño y el diseño de la interfaz. Los métodos de diseño comúnmente utilizados incluyen diseño horizontal (QHBoxLayout), diseño vertical (QVBoxLayout), diseño de cuadrícula (QGridLayout), etc. El administrador de diseño puede ajustar automáticamente la posición y el tamaño de los controles de acuerdo con el tamaño de la ventana para garantizar que la interfaz tenga un buen efecto de visualización en diferentes resoluciones.
16. Contenido de referencia
Resumen de las preguntas de la entrevista QT_Preguntas de la entrevista qt_BC Cainiao Blog-CSDN Blog