2011-07-01 12 views
7

¿Hay alguna forma de tener una función en mi clase de aplicación (derivada de QApplication) llamada cuando se llama QCoreApplication::exec()? No veo ninguna señal o evento que se genere justo antes de que comience el ciclo del mensaje.Qt Intercept Application :: exec en la clase de aplicación?

Tengo varios componentes para crear que dependen de un objeto de aplicación totalmente constructor. A su vez, algunos otros componentes deben crearse después de esos componentes (ya que dependen de ellos); sin embargo, estos son los cuadros de diálogo principales en la aplicación, por lo que algo debe iniciarlos.

Actualmente solo publico una señal en cola del constructor de la aplicación, que luego se procesa una vez que se inicia el ciclo de eventos. Me pregunto si hay una forma más clara de interceptar exec?

+0

Eso suena bien, pero realmente no entiendo por qué necesita esa señal en cola. No necesita ejecutar el bucle de eventos para construir widgets, simplemente no aparecerán. – Mat

+0

Hay un poco de marco de soporte en la función 'main' que debe completarse antes de que se puedan construir los widgets. Ese marco necesita un objeto de aplicación totalmente constructor. –

Respuesta

1

esta es una técnica antigua en aplicaciones de interfaz gráfica de usuario pero podría funcionar para usted.

use QObject::startTimer(0) luego vuelva a implementar QObject :: timerEvent() para tener el various components that rely on a fully constructed application object. De este modo, el various components that rely on a fully constructed application object solo se creará una vez que comience el ciclo de eventos.

un poco de explicación: QObject :: startTimer (int ms) es una función que se ejecuta un temporizador en milisegundos que dispara cada ms. Si pasa "0" como argumento, entonces se dispara tan pronto como comience el ciclo de evento. una vez que se activa, llama a QObject :: timerEvent() en la misma clase que QObject :: startTimer(). asegúrese de detener el temporizador con QObject :: killTimer() dentro de su reimplementación de QObject :: timerEvent() o de lo contrario el temporizador disparará infinitamente.

pero @Mat tiene un punto, simplemente porque el bucle de evento no se ha iniciado, no significa que la aplicación QCoreApplication no está completamente construida. Prueba y echa un vistazo a esto.

{ 
    QApplication app(argc, argv); //this is already a fully contructed QApplication instance 
    MyClass *myObject = new MyClass; //this relies on a fully constructed QApplication instance 

    return app.exec(); //this starts the event loop as you already know. 
} 
Cuestiones relacionadas