您好,登錄后才能下訂單哦!
Qt Creator是Qt官方的IDE,這個IDE為Qt編程人員提供了一個完整的開發環境。當然了,這個IDE是用Qt寫的,也是免費的。這個IDE真正的編譯部分使用了MinGW gcc compiler。也就是說,這個IDE主要的作用是協助開發人員編寫代碼,并以更加友好的圖形界面方式(而不是命令行)使用MinGW。下面我以MS Visual Studio作為參照,講一些在Windows平臺上Qt Creator的使用體會與小技巧。
1. 工程文件與項目組織結構
VC6之前都是使用dsw文件(之后是sln)來管理軟件工程的(新版的VC提供dsw轉換工具),每個dsw中可以有很多dsp,即項目文件。每個dsp中都可以包含任意多的.h.cpp.rc文件,每個dsp都可以單獨編譯。可以編譯成exe或dll或ocx等等。一個dsw中的所有dsp也可以一起編譯,而且各個dsp之間可以設定依存關系。比如一個dsp叫baseui,一個叫myapp。其中baseui將編譯成為baseui.dll,而myapp將編譯成為myapp.exe。在myapp中需要用到baseui中的某個類或某個資源或某個函數,那么myapp的依存關系中就需要有baseui。設定好依存關系后,每次整體編譯之前,baseui就會先于myapp編譯,從而保證myapp需要的lib在編譯之前就已經具備。
在Qt Creator中,項目的組織文件是pro類型,它并不具備dsw, dsp那樣的2級結構。它跟dsw或dsp文件一樣,也是機器生成的文本文件。不過在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。
2. IDE界面
VC的界面很經典,多年未發生根本性的改變(但相信很多老VCer對VC6以后的版本取消Class Wizard仍然耿耿于懷)。
Qt Creator界面比較一般。硬傷是沒有類樹(Class Tree),這個對于OOP來說非常的不便。由于沒有類樹,開發人員便不能對類進行相關的編碼,這就意味著增加一個member function需要在該類的.h和.cpp文件中手工輸入兩次函數名稱。同時,重載函數時也需比在VC中付出更多的時間。雖然增加一個函數的時間可能只增加5-10秒,但對于剛剛靈感閃現的程序員來說,可能會比較有挫折感。希望后面的版本能夠加上。
代碼輸入界面Qt Creator做得不錯,語法著色(不光有標準C++的著色,還有Qt特有關鍵字的著色,如SLOT等)和類似VC的intellisense功能(代碼自動完成)讓人感覺很舒服。我記得前段時間看VC Team的BLOG還有人留言說intellisense很多問題。在我使用Qt Creator的這兩個月時間里,還沒發現bug。但是我一直覺得Visual Assist的功能做的最專業。使用VA的同學請舉手。
3. 編譯
在編譯速度上,VC全勝。快得不只一點點。當然qmake本身會多占用一些時間,但還是能明顯感覺到VC快很多。
在編譯代碼質量上,我是門外漢,不敢妄下結論。但我感覺Qt生成的exe文件會更大一些,不知是不是為性能做的犧牲。所以TX門寫代碼時,千萬不要圖省事,把整個Qt模塊(如QtGUI)都include進來。
4. Debug
不得不說,又是VC贏了。Qt Creator不但速度慢,還經常有些莫名其妙的問題。你可能會被要求重新build Debugging Helper。還可能會出現gdb crash。
5. 幫助
MSDN就不多說了。Qt專門有個Qt Assist程序用于提供所有幫助。Qt Creator中本身也有一個help模塊。在網絡上,Qt central提供forum和wiki。但是,如果編程中遇到問題,那么你就會發現,使用Qt的人比起使用VC的人來少太多了。可能VC中的一些小問題別人早就碰到并在網上公布解決方案了。而Qt中你碰到的問題,可能在網上很難找到答案。使用Qt的TX們,大家還要努力豐富開源社區。
6. 如何選擇
如果你只是使用Qt在Windows上開發,可以選擇VC2008。Express版本也是免費的。
如果你是要開發Cross-platform的程序,還是應該選擇Qt Creator。因為它在Windows, Linux和Mac上都可以運行(MinGW也是Cross-platform的)。所以從平臺移植和維護上考慮,可能Qt Creator是個更好的選擇。另外,我個人的經歷是,從VC6用到2008,經常會碰到VC莫名其妙的退出,有時代碼還未保存。而在使用Qt Creator的這段時間里,這種情況從未發生。相信這也從側面證明了Qt本身是很健壯的。
一些使用Qt Creator的tip
1. 使用network或opengl或sql等模塊后編譯不通過
在pro文件中寫如下語句:QT += network 或 QT += opengl 或 QT += sql
2. 代碼自動完成功能區分大小寫
在Tools->Options菜單中的Text Editor->Completion中,勾掉“Case-sensitive completion”,這樣就不會因為你大小寫錯了而使整個completion都消失掉。
3. Debug時提示沒有debug helper
如下圖,在Options菜單中紅圈的位置點擊Rebuild。
4. Qrc中增加了圖片,但是在程序中用不了
Qrc文件中可以增加Qt程序使用的資源文件。這些文件會被編譯到exe文件中。增加資源時需要先增加前綴prefix。看看你的prefix寫的對不對。如果前綴是“/”那么一個典型的圖片文件路徑可能是“:/Resources/Images/aaa.png”。另外,在qrc中,文件名和路徑名是區分大小寫的。我曾經在這里卡了好幾個小時,最后都懷疑Qt Creator是不是“水貨”了。
5. Qt Creator在Windows系統中,怎樣鏈接VC生成的動態鏈接庫
這個問題曾經困擾了我一整天。我想的是按照VC中的方法,增加include文件,增加lib文件,然后編譯即可。誰知鏈接時總是出現問題。提示是undefined reference to XXXXX。查了手冊和網絡,原來這是mingw用戶在windows上經常遇到的問題,而且好像至今沒有完美的解決方案。這個錯誤的起因是因為VC生成lib的_stdcall函數名與mingw生成的不一致。一種解決方案是使用libdll等工具生成新的用于mingw的lib,另一種解決方案是把代碼全拿過來重新編譯(汗)。
最后我也不知道為什么自己試出來一個新的方法,這個方法尚未從技術上找到原因。也未經過廣泛的測試。有興趣的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究竟是怎么做的。
6. Qt項目更換文件目錄后編譯失敗
Qt Creator編譯時不支持中文路徑名。對于帶空格的路徑,如果你想在pro文件中加入,需要使用$$quote來指定,如:$$quote(C:/mylibs/extra libs/extra.lib)。另外,如果你習慣了Windows下‘/’的話,最好改改你的習慣,在Qt中路徑習慣用‘/’。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。