Red de conocimiento informático - Problemas con los teléfonos móviles - La diferencia entre eventos y señales QT

La diferencia entre eventos y señales QT

La señal es emitida por un objeto específico y luego entregada inmediatamente a la ranura conectada por la función de conexión para su procesamiento; para eventos, Qt usa una cola de eventos para mantener todos los eventos emitidos cuando ocurre un nuevo evento. , se agregará al final de la cola de eventos. Una vez completado el evento anterior, los siguientes eventos se eliminarán para su procesamiento. Sin embargo, cuando sea necesario, los eventos Qt se pueden procesar directamente sin ingresar a la cola de eventos. Además, los eventos también se pueden filtrar mediante "filtros de eventos". En general, si utilizamos componentes, nos preocupamos por las señales y las ranuras; si personalizamos los componentes, nos preocupamos por los eventos. Porque podemos cambiar la operación predeterminada del componente a través de eventos. Por ejemplo, si queremos personalizar un QPushButton, entonces debemos reescribir su evento de clic del mouse y su evento de manejo del teclado, y enviar la señal clicked() en el momento apropiado.

¿Recuerdas que creamos un objeto QApplication en la función principal y luego llamamos a su función exec()? De hecho, esta función inicia el bucle de eventos de Qt. Después de ejecutar la función exec(), el programa ingresará al bucle de eventos para escuchar los eventos de la aplicación. Cuando ocurre un evento, Qt creará un objeto de evento. Todos los eventos en Qt heredan de la clase QEvent. Una vez creado el objeto de evento, Qt pasa el objeto de evento a la función event() de QObject. La función event() no maneja eventos directamente, sino que los envía a un controlador de eventos específico según el tipo de objeto de evento.

En QWidget, la clase principal de todos los componentes, se definen muchas funciones de manejo de eventos, como keyPressEvent(),

keyReleaseEvent(), mouseDoubleClickEvent(), mouseMoveEvent (), mousePressEvent. (), mouseReleaseEvent(), etc. Estas funciones son virtuales protegidas, es decir, deberíamos redefinir estas funciones en subclases.