1、QApplication
QApplication類管理GUI程序的控制流和主要設置,是基於QWidget的,為此特化了QGuiApplication的一些功能,處理QWidget特有的初始化和結束收尾工作。
對於使用了Qt的任何GUI程序來說,不管何時何地有多少個Window,但只有一個QApplication對象,如果不是基於QWidget的程序,相應的則使用QGuiApplication,后者不依賴於Widget特有的庫。
有些程序是不使用GUI的,通過命令行參數執行不同的任務而不用手動設置,這時使用QCoreApplication就夠了,避免初始化不必要的GUI資源。
上面提到了只能有一個QApplication實例,其實就是Singleton模式,對象指針通過instance()靜態函數獲取,或者使用等效的qApp宏。QApplication的主要職責如下:
1、使用用戶的桌面設置進行初始化,這些設置如palette()、font()、doubleClickInterval(),然后跟蹤這些屬性的變化,如用戶通過某種配置面板修改了全局桌面設置。
2、處理事件,從窗口系統接收事件並派發到相應的Widget,使用sendEvent()和postEvent()函數可以派發事件。
3、處理命令行參數,設置內部狀態。
4、定義GUI外觀,外觀由QStyle對象包裝,運行時通過setStyle()函數進行設置。
5、設置顏色分配規則,對應的函數為setColorSpec()。
6、本地化字符串,函數為translate()。
7、提供了一些有用的對象,如desktop()、clipboard()函數。
8、知道Widget及Window,相應的函數為widgetAt()、topLevelWidgets()、closeAllWindows()。
9、管理鼠標光標,函數為setOverrideCursor()。
從上面可以看出,QApplication作了許多初始化工作,因此在任何其它的UI對象創建之前必須先創建QApplication對象,而且還可以通過命令行參數設置一些內部狀態。
2、QGuiApplication
QApplication繼承自QGuiApplication,后者是基於非QWidget的,提供了會話管理,用戶退出時可以友好地終止程序,如果終止不了還可以取消對應的進程,甚至是保存程序的所有狀態用於將來的會話,相關函數為isSessionRestored()、sessionId()、commitDataRequest()、saveDataRequest()。
3、QCoreApplication
QGuiApplication繼承自QCoreApplication,后者不包括UI,一大核心功能是提供了event loop,這些event可以來自操作系統,如timer、網絡事件,以及其它來源的event都可以被收發。調用exec()函數進入event loop,直到quit()函數調用時才退出,退出時發送aboutToQuit()信號,等同於exit(0)函數,sendEvent()函數立即處理事件,postEvent()函數把事件放入消息隊列以等待后續處理,處於消息隊列的的event還可以通過removePostedEvent()和sendPostedEvent()進行刪除和立即處理。
與程序路徑相關的有兩個函數applicationDirPath()和applicationFilePath(),另外一個是庫相關的,函數為libraryPaths()、setLibraryPaths()、addLibraryPath()、removeLibraryPath(),以及QLibrary類。
國際化、翻譯相關的函數為translate(),以及installTranslator()和removeTranslator()。
獲取命令行參數使用函數arguments(),專門處理命令行參數的類為QCommandLineParser。
為了保證兼容性,還要適當的設置語系setLocale()。
