1、QT跨平臺的實現機制
跨平臺:
狹隘的理解:一個程序能在不同的平臺上跑,操作系統就是平臺。
廣義的理解:平臺就是API的提供者,API你就可以理解爲系統提供給你的函數,就是不需要你自己寫的,系統自帶的,並且只有這個系統纔有的。提供API的不一定是操作系統,也可能是軟件,虛擬機或者其他的什麼。
實現機制:
和java一樣,針對每一種OS平臺,QT都有一套對應的底層類庫,而接口是完全一致的。
因此只要是在QT庫上開發的程序,放在任何一種平臺下都可以編譯運行(前提條件是:程序中沒有使用某OS特有的機能)。
也就是說在OS和應用層之間,增加了一個平臺層來保證可移植性。
2、對Qt編譯環境的認識
簡單地講,Qt其實就是一個C++的類庫。配置編譯環境,其實就是配置一個C++編譯環境,同時將Qt庫載入進來。當然Qt還額外提供了自己內部的一些功能,例如界面編輯器(designer)等。網上有很多配置開發環境的文章,多是手把手一步一步講,非常詳細。但是我初學的時候仍會出一些問題,不知道怎麼解決。這裏對整個編譯環境做一個介紹,希望對大家有幫助,在出問題的時候知道從何下手。
編譯器與Qt庫
Qt是跨平臺的庫,不論你在哪個平臺下使用,都需要一個編譯器。windows下如果使用VS2010、VS2012等做編譯器,則需要到Qt官網下載對應編譯器版本的Qt二進制庫文件。換句話說,如果安裝了在VS2010版本的Qt二進制庫文件,則必須安裝VS2010做編譯器Qt程序才能編譯。如大家所知道的,不同的編譯器編譯同一段代碼生成的庫是不能替代使用的,也就是說用VS2008編譯出來的Qt庫,不能在VS2010做編譯器時使用。對於大部分平臺的編譯器在官網上都能下載(例如windows、linux、android、ios、mac),但在嵌入式Linux平臺(也就是我們做畢設需要用的Arm上的Qt程序)Qt沒有提供二進制庫文件,所以我們首先需要一個交叉編譯器(arm-linux-gcc),然後下載Qt的源代碼,使用這個針對arm的編譯器編譯Qt的源代碼生成我們需要的Qt庫。
調試器
有了編譯器與對應的Qt庫我們就可以編譯發佈版本的Qt應用程序了,但是不能調試。如果點擊debug按鈕,可能會提示未發現可用的調試器。所以我們還需要一個調試器,windows下VS做編譯器的時候需要CDB來做調試器,MinGw做編譯器需要gdb來做編譯器。如果你的編譯器出了問題,下載並安裝你需要的調試器,然後也是在 工具(Tools)-->選項(Option)-->構建和運行(Build and run)中進行配置。
構建套件(Kit)
有了編譯器、Qt庫、調試器三個東西,我們就可以編譯Qt應用程序了,但是我們的電腦上可能有多個版本的Qt庫與編譯器,我的電腦上就裝了MinGw版的Qt5.3和VS2010版的Qt4.8。那麼我們編譯的時候使用那個版本來進行編譯呢。這就要用到構建套件來進行管理。我們可以在工具(Tools)-->選項(Option)-->構建和運行(Build and run)中新建一個構建套件,取名叫“Desktop Qt 5.3 MinGW 32bit”然後分別爲他們配置Mingw作爲編譯器,Qt5.3庫(Mingw版的),編譯器gdb。也可以再添加其他的構建套件,例如 Windows。
我們就可以使用這個構建來進行編譯、調試程序。
3、QT跟MFC的區別v
QT是跨平臺的開發工具
MFC其實是封裝了winAPI,裏面既有面向對象,也有面向流程的,比較亂,更沒有邏輯,入門比較不容易。使用vc++編譯器
QT更面向對象,引入信號與槽的機制,是編程看起來更有邏輯,入門比較容易。QT使用gcc編譯器(MinGW)
QT由於封裝得層數比較多,所以運行的時候效率會比MFC低一些。(MFC>QT>C#)
4、信號與槽機制
實現機制:
QT中信號與槽的機制依靠元數據來實現,
調用方式:
signal/slot目前有三種調用方式
1.DirectConnection
和以前一樣,在emit處直接invoke你的slot
函數,一般情況是sender,receiver在同一線程
2.QueuedConnection
將發送Event給你的receiver所在的線程
postEvent(QEvent::MetaCall,...)
slot 函數會在receiver所在的線程的event loop中進行處理,一般情況是sender,receiver不在同一線程
3.BlockingQueuedConnection
調用sendEvent(QEvent::MetaCall,...),在receiver所在的線程處理完成後纔會返回;只能當sender,receiver不在同一線程時纔可以
信號與槽關係:
一個信號可以連接多個槽,一個槽可以連接多個信號
一個信號可以跟一個信號相連接
連接可以被移除(disconnect())