對QT的一點認識

 

1QT跨平臺的實現機制

跨平臺:

狹隘的理解:一個程序能在不同的平臺上跑,操作系統就是平臺。
廣義的理解:平臺就是API的提供者,API你就可以理解爲系統提供給你的函數,就是不需要你自己寫的,系統自帶的,並且只有這個系統纔有的。提供API的不一定是操作系統,也可能是軟件,虛擬機或者其他的什麼。

實現機制:

  java一樣,針對每一種OS平臺,QT都有一套對應的底層類庫,而接口是完全一致的。
因此只要是在QT庫上開發的程序,放在任何一種平臺下都可以編譯運行(前提條件是:程序中沒有使用某OS特有的機能)。
也就是說在OS和應用層之間,增加了一個平臺層來保證可移植性。

2、對Qt編譯環境的認識
  簡單地講,Qt其實就是一個C++的類庫。配置編譯環境,其實就是配置一個C++編譯環境,同時將Qt庫載入進來。當然Qt還額外提供了自己內部的一些功能,例如界面編輯器(designer)等。網上有很多配置開發環境的文章,多是手把手一步一步講,非常詳細。但是我初學的時候仍會出一些問題,不知道怎麼解決。這裏對整個編譯環境做一個介紹,希望對大家有幫助,在出問題的時候知道從何下手。

 編譯器與Qt

  Qt是跨平臺的庫,不論你在哪個平臺下使用,都需要一個編譯器。windows下如果使用VS2010VS2012等做編譯器,則需要到Qt官網下載對應編譯器版本的Qt二進制庫文件。換句話說,如果安裝了在VS2010版本的Qt二進制庫文件,則必須安裝VS2010做編譯器Qt程序才能編譯。如大家所知道的,不同的編譯器編譯同一段代碼生成的庫是不能替代使用的,也就是說用VS2008編譯出來的Qt庫,不能在VS2010做編譯器時使用。對於大部分平臺的編譯器在官網上都能下載(例如windowslinuxandroidiosmac),但在嵌入式Linux平臺(也就是我們做畢設需要用的Arm上的Qt程序)Qt沒有提供二進制庫文件,所以我們首先需要一個交叉編譯器(arm-linux-gcc),然後下載Qt的源代碼,使用這個針對arm的編譯器編譯Qt的源代碼生成我們需要的Qt庫。

調試器

  有了編譯器與對應的Qt庫我們就可以編譯發佈版本的Qt應用程序了,但是不能調試。如果點擊debug按鈕,可能會提示未發現可用的調試器。所以我們還需要一個調試器,windowsVS做編譯器的時候需要CDB來做調試器,MinGw做編譯器需要gdb來做編譯器。如果你的編譯器出了問題,下載並安裝你需要的調試器,然後也是在     工具(Tools-->選項(Option)-->構建和運行(Build and run)中進行配置。

 

構建套件(Kit

  有了編譯器、Qt庫、調試器三個東西,我們就可以編譯Qt應用程序了,但是我們的電腦上可能有多個版本的Qt庫與編譯器,我的電腦上就裝了MinGw版的Qt5.3VS2010版的Qt4.8。那麼我們編譯的時候使用那個版本來進行編譯呢。這就要用到構建套件來進行管理。我們可以在工具(Tools-->選項(Option)-->構建和運行(Build and run)中新建一個構建套件,取名叫“Desktop Qt 5.3 MinGW 32bit”然後分別爲他們配置Mingw作爲編譯器,Qt5.3庫(Mingw版的),編譯器gdb。也可以再添加其他的構建套件,例如 Windows

我們就可以使用這個構建來進行編譯、調試程序。

3QTMFC的區別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())

 

  

發佈了18 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章