Qt Creator 使用技巧

 Qt CreatorQt官方的IDE,這個IDEQt編程人員提供了一個完整的開發環境。當然了,這個IDE是用Qt寫的,也是免費的。這個IDE真正的編譯部分使用了MinGW gcc compiler。也就是說,這個IDE主要的作用是協助開發人員編寫代碼,並以更加友好的圖形界面方式(而不是命令行)使用MinGW。下面我以MS Visual Studio作爲參照,講一些在Windows平臺上Qt Creator的使用體會與小技巧。

 

  1. 1.       工程文件與項目組織結構

 

        VC6之前都是使用dsw文件(之後是sln)來管理軟件工程的(新版的VC提供dsw轉換工具),每個dsw中可以有很多dsp,即項目文件。每個dsp中都可以包含任意多的.h.cpp.rc文件,每個dsp都可以單獨編譯。可以編譯成exedllocx等等。一個dsw中的所有dsp也可以一起編譯,而且各個dsp之間可以設定依存關係。比如一個dspbaseui,一個叫myapp。其中baseui將編譯成爲baseui.dll,而myapp將編譯成爲myapp.exe。在myapp中需要用到baseui中的某個類或某個資源或某個函數,那麼myapp的依存關係中就需要有baseui。設定好依存關係後,每次整體編譯之前,baseui就會先於myapp編譯,從而保證myapp需要的lib在編譯之前就已經具備。

Qt Creator中,項目的組織文件是pro類型,它並不具備dsw, dsp那樣的2級結構。它跟dswdsp文件一樣,也是機器生成的文本文件。不過在Qt Creator中,你可能經常需要手動去編輯這個文件。下面是一個簡單的pro文件:

TARGET = Test112

TEMPLATE = app

SOURCES += main.cpp/

        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

1行“TARGET”定義了目標文件的名稱;

2行“TEMPLATE”定義了目標文件的類型,app即可執行文件。Lib是庫文件(可以使dll,也可以使使用靜態鏈接的庫或是plugin);

SOURCES”裏定義了所有的cpp文件;

HEADERS”裏定義了所有的h文件;

FORMS”裏定義了所有的ui文件(可以在Qt Creator中進行可視化編輯的界面類);

這裏多說一下,ui文件經過qmake之後會生成ui_開頭的一個.h文件,裏面由程序自動生成一個新的UI類,類裏面把可視化編輯的界面元素都用代碼寫出來。在ui文件對應的類中,這個自動生成的ui類會被new一個新的實例,用於協助開發人員。

不知道我說明白了沒有,就是ui文件會幫助開發人員生成一些界面相關的代碼,然而這些代碼是以另一個新的類的成員變量及代碼的形式被用於原來那個界面類的。(汗啊,我都說累了)我一直不明白爲什麼Qt Creator不像VC那樣直接去修改原有類的代碼。難道這個實現起來很困難嗎?我打開.ui文件看過,它其實是界面的一個xml文件描述。忘記在哪裏看到這種實現有一個優點就是如果程序界面部分寫的足夠靈活的話,程序升級時如果只涉及到界面,那麼可以只下載這個ui文件進行升級即可。這個特性可能會讓那些saas軟件開發人員欣喜若狂。但對於大部分desktop app開發人員來說,還是有點讓人迷惑。好在Qt中有signal/slot可用於widget與界面類(如dialog)之間傳遞消息,否則這種中間加一層“假父類”的實現方式是在是讓人難以接受。

Pro文件說了這麼多,足以說明Qt Creator在項目管理與設置上並不是特別友好。與VC(甚至VC6)相比都有較大差距。編輯pro文件使我想起了N年前使用命令行方式編寫turbo C程序。呵呵,可能開源軟件就是這個範兒?

關於pro文件,還有很多內容需要開發人員去了解。我會專門寫個tip

 

  1. 2.       IDE界面

        VC的界面很經典,多年未發生根本性的改變(但相信很多老VCerVC6以後的版本取消Class Wizard仍然耿耿於懷)。

        Qt Creator界面比較一般。硬傷是沒有類樹(Class Tree,這個對於OOP來說非常的不便。由於沒有類樹,開發人員便不能對類進行相關的編碼,這就意味着增加一個member function需要在該類的.h.cpp文件中手工輸入兩次函數名稱。同時,重載函數時也需比在VC中付出更多的時間。雖然增加一個函數的時間可能只增加5-10秒,但對於剛剛靈感閃現的程序員來說,可能會比較有挫折感。希望後面的版本能夠加上。

    代碼輸入界面Qt Creator做得不錯,語法着色(不光有標準C++的着色,還有Qt特有關鍵字的着色,如SLOT等)和類似VCintellisense功能(代碼自動完成)讓人感覺很舒服。我記得前段時間看VC TeamBLOG還有人留言說intellisense很多問題。在我使用Qt Creator的這兩個月時間裏,還沒發現bug。但是我一直覺得Visual Assist的功能做的最專業。使用VA的同學請舉手。

 

  1. 3.       編譯

    在編譯速度上,VC全勝。快得不只一點點。當然qmake本身會多佔用一些時間,但還是能明顯感覺到VC快很多。

    在編譯代碼質量上,我是門外漢,不敢妄下結論。但我感覺Qt生成的exe文件會更大一些,不知是不是爲性能做的犧牲。所以TX門寫代碼時,千萬不要圖省事,把整個Qt模塊(如QtGUI)都include進來。

 

  1. 4.       Debug

    不得不說,又是VC贏了。Qt Creator不但速度慢,還經常有些莫名其妙的問題。你可能會被要求重新build Debugging Helper。還可能會出現gdb crash

 

  1. 5.       幫助

        MSDN就不多說了。Qt專門有個Qt Assist程序用於提供所有幫助。Qt Creator中本身也有一個help模塊。在網絡上,Qt central提供forumwiki。但是,如果編程中遇到問題,那麼你就會發現,使用Qt的人比起使用VC的人來少太多了。可能VC中的一些小問題別人早就碰到並在網上公佈解決方案了。而Qt中你碰到的問題,可能在網上很難找到答案。使用QtTX們,大家還要努力豐富開源社區。

 

  1. 6.       如何選擇

    如果你只是使用QtWindows上開發,可以選擇VC2008Express版本也是免費的。

    如果你是要開發Cross-platform的程序,還是應該選擇Qt Creator。因爲它在Windows, LinuxMac上都可以運行(MinGW也是Cross-platform的)。所以從平臺移植和維護上考慮,可能Qt Creator是個更好的選擇。另外,我個人的經歷是,從VC6用到2008,經常會碰到VC莫名其妙的退出,有時代碼還未保存。而在使用Qt Creator的這段時間裏,這種情況從未發生。相信這也從側面證明了Qt本身是很健壯的。

 

一些使用Qt Creatortip

 

  1. 1.       使用networkopenglsql等模塊後編譯不通過

pro文件中寫如下語句:QT += network  QT += opengl  QT += sql

 

  1. 2.       代碼自動完成功能區分大小寫

Tools->Options菜單中的Text Editor->Completion中,勾掉“Case-sensitive completion”,這樣就不會因爲你大小寫錯了而使整個completion都消失掉。

 

  1. 3.       Debug時提示沒有debug helper

如下圖,在Options菜單中紅圈的位置點擊Rebuild

 

  1. 4.       Qrc中增加了圖片,但是在程序中用不了

Qrc文件中可以增加Qt程序使用的資源文件。這些文件會被編譯到exe文件中。增加資源時需要先增加前綴prefix。看看你的prefix寫的對不對。如果前綴是“/”那麼一個典型的圖片文件路徑可能是“:/Resources/Images/aaa.png”。另外,在qrc中,文件名和路徑名是區分大小寫的。我曾經在這裏卡了好幾個小時,最後都懷疑Qt Creator是不是“水貨”了。

 

  1. 5.       Qt CreatorWindows系統中,怎樣鏈接VC生成的動態鏈接庫

這個問題曾經困擾了我一整天。我想的是按照VC中的方法,增加include文件,增加lib文件,然後編譯即可。誰知鏈接時總是出現問題。提示是undefined reference to XXXXX。查了手冊和網絡,原來這是mingw用戶在windows上經常遇到的問題,而且好像至今沒有完美的解決方案。這個錯誤的起因是因爲VC生成lib_stdcall函數名與mingw生成的不一致。一種解決方案是使用libdll等工具生成新的用於mingwlib,另一種解決方案是把代碼全拿過來重新編譯(汗)。

最後我也不知道爲什麼自己試出來一個新的方法,這個方法尚未從技術上找到原因。也未經過廣泛的測試。有興趣的TX可以試試。

如果你要鏈接到一個abc.lib文件,頭文件是abc.h,動態鏈接庫是abc.dll。那麼在pro文件中先加入下面一行

INCLUDEPATH += D:/Qt/include

INCLUDEPATH是一個編譯變量,存儲了所有包含include文件的路徑,這個目錄下保存了abc.h文件。然後再加入下面一行:

LIBS += D:/Qt/bin/abc.dll

LIBS也是一個編譯變量,存儲了所有需要鏈接的庫文件。看清楚了,不是“abc.lib”哦,是“abc.dll”。神奇吧,這樣居然可以鏈接成功了(lib文件可以刪了)。喜歡研究的TX可以研究研究mingw究竟是怎麼做的。

 

  1. 6.       Qt項目更換文件目錄後編譯失敗

Qt Creator編譯時不支持中文路徑名。對於帶空格的路徑,如果你想在pro文件中加入,需要使用$$quote來指定,如:$$quote(C:/mylibs/extra libs/extra.lib)。另外,如果你習慣了Windows下‘/’的話,最好改改你的習慣,在Qt中路徑習慣用‘/’。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章