2012-01-16 6 views
14

I 메인 이런 종류의()와 Qt는 응용 프로그램을 ...이Qt : 이벤트 루프가 시작될 때 알림이 있습니까?

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(); 
} 

윈는 윈와 통신을 시작할 수 있습니다 때 알 필요가 전에 생성이 다른 스레드. 하지만 mainWin은 Qt 신호, 슬롯, 타이머 등을 사용하기 때문에 이벤트 루프가 실행될 때까지 (exec()를 통해) 진정으로 흔들릴 준비가되어 있지 않습니다.

제 질문은 : 이벤트 루프가 시작될 때 방출되는 신호 또는 이벤트가 있습니까?

이것을 고려하십시오. mainWin.Init()에서 QTimer와 같은 것을 만들 수 있고 .start()를 호출하여 킥오프 할 수도 있습니다. 하지만 실제로 실행되지 않고 exec()가 호출 될 때까지 이벤트를 트리거합니다. 그래서 이벤트 루프가 실제로 시작되었는지 알 필요가 있습니다.

+0

스레드가 Qt 스레드 또는 기본 스레드입니까? – UmNyobe

답변

9

당신은 exec() 호출하기 전에 창에 신호를 보낼 수 있습니다. 그러면 app의 신호 대기열에 항목이 배치됩니다. exec()이 실행 중일 때 신호가 전달되고 창에 이벤트 루프가 실행 중임을 알립니다.

간단한 방법은 QTimer::singleShot(0, &mainWin, SLOT(onEventLoopStarted()));을 사용하여 윈도우 클래스의 맞춤 슬롯에 연결하는 것입니다.

1

다음과 같은 순서대로 작업을 수행 할 수 있습니다

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

참고로, 이것은 PyQt에서 작동하지 않는 것으로 보입니다. 어떻게 든 신호는 app.exec_()를 호출하기 전에 방출되고 처리됩니다. – orodbhen

2

이벤트 루프가 아직 실행 중이 아닐 때 방사 신호가 손실되지 않으므로 스레드가 창 준비가 언제인지 알 필요가 없을 수도 있습니다.
스레드가 신호를 보내기 시작할 수 있습니다. ~ 창이 즉시 나타나지만 이벤트 루프가 실행 중일 때 에서의 신호 만 수신합니다.