2011-07-01 39 views
7

當調用QCoreApplication::exec()時,是否有某種方法可以在我的應用程序類(派生自QApplication)中調用函數?我沒有看到消息循環開始之前生成的任何信號或事件。Qt攔截應用程序類中的Application :: exec?

我有各種組件被創建,這取決於完全構造函數應用程序對象。反過來,還需要在這些組件之後創建一些其他組件(因爲它們依賴它們) - 但這些是應用程序中的主要對話框,因此必須啓動它們。

目前我只是從應用程序構造函數發佈排隊信號,然後在事件循環開始時處理該信號。我只是想知道是否有更明確的方法來攔截exec

+0

這聽起來很好,但我真的不明白爲什麼你需要排隊的信號。您不需要運行事件循環來構建小部件,它們只是不會顯示出來。 – Mat

+0

在構建任何小部件之前需要完成一些支持框架。該框架需要一個完整的構造函數Application對象。 –

回答

1

這是一個gui應用程序中的舊技術,但它可能適用於您。

使用QObject::startTimer(0)然後重新實現QObject :: timerEvent()來獲得various components that rely on a fully constructed application object。通過這樣做,various components that rely on a fully constructed application object只會在事件循環開始時創建。

的解釋一點:QObject的:: startTimer所(INT MS)是運行在毫秒計時器一個觸發間隔毫秒功能。如果您將「0」作爲參數傳遞,那麼只要事件循環開始,它就會觸發。一旦觸發,它會調用同一個類中的QObject :: timerEvent(),調用QObject :: startTimer()。確保在QObject :: timerEvent()的重新實現中使用QObject :: killTimer()停止定時器,否則定時器將無限激發。

但@Mat有一點,只是因爲事件循環還沒有開始,並不意味着QCoreApplication沒有完全構建。試試看看這個。

{ 
    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. 
} 
相關問題