2012-01-16 10 views
14

Ho un'applicazione Qt con questo tipo di main() ...Qt: C'è una notifica all'avvio del loop evento?

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWin; 

    ... A separate, non-GUI thread is launched here 

    mainWin.Init(); 
    mainWin.show(); 

    app.exec(); 
} 

Questo altro thread che viene creato prima della MainWin ha bisogno di sapere quando si può iniziare a comunicare con il MainWin. Ma dal momento che mainWin utilizza segnali, slot, timer, ecc., Qt non è veramente pronto a suonare fino a quando non viene eseguito il ciclo degli eventi (tramite exec()).

La mia domanda è: c'è qualche segnale o evento che viene emesso quando il ciclo degli eventi è iniziato?

Considerate questo. In mainWin.Init(), puoi creare qualcosa come un QTimer e persino chiamare .start() per avviarlo. Ma in realtà non verrà eseguito e non innescherà eventi fino a quando exec() non sarà stato chiamato. Questo è il motivo per cui ho bisogno di sapere quando il ciclo degli eventi è veramente iniziato.

+0

Il thread è un thread Qt o nativo? – UmNyobe

risposta

9

È possibile inviare un segnale alla finestra prima della chiamata exec(). Ciò inserirà una voce nella coda dei segnali di app. Quando exec() è in esecuzione, il segnale verrà consegnato e la finestra saprà che il ciclo degli eventi è in esecuzione.

Un modo semplice sarebbe utilizzare QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted())); che si connette a uno slot personalizzato della classe della finestra.

1

Si può fare nel seguente ordine:

QApplication app(argc, argv); 
Mainwinwdow mainWin; 
QThread yourThread; 

//connect the signals from the thread to the mainWin here 

mainWin.Init(); 
mainWin.show(); 

yourThread.start(); 

return app.exec(); 
+1

Cordiali saluti, questo non sembra funzionare con PyQt. In qualche modo i segnali vengono emessi e gestiti prima di chiamare app.exec_(). – orodbhen

2

Poiché i segnali emessi non si perdono quando il ciclo degli eventi non è ancora in esecuzione, il thread potrebbe non essere necessariamente necessario sapere quando la finestra è pronta.
La filettatura potrebbe iniziare a inviare segnali a la finestra subito ma riceverà solo i segnali da la finestra quando il ciclo di eventi è in esecuzione.

Problemi correlati