qt是一個c++的界面庫,其特點就是其源碼可以跨平台編譯,這樣在寫自己的小工具時可以方便地在windows,mac或linux環境下移植了。在windows下寫c++程序當然選vs,在mac下寫程序當然用xcode,在linux下就完全控制台吧。
本人僅僅將其看成是一個c++的庫,所以不想學習新的的IDE--qt creator,也不想去學qt designer,所以qt的預處理都需要自己用命令來折騰。
Moc
從qt繼承而來的類只要用了關鍵字 Q_OBJECT,都必須生成其對應的moc文件,命令如下
moc.exe myclass.h -o mac_myclass.cpp
其中myclass.h中有類有Q_OBJECT屬性。在vs項目中只需要添加mac_myclass.cpp文件即可。
UI
雖然不使用designer來設計界面,但在編譯一個demo項目時都會用*.ui文件,這時得先將其用uic.exe進行轉化
uic.exe app.ui -o ui_app.h
其中app.ui是用designer設計好的界面文件, ui_app.h是生成的頭文件。然后在c++項目中#include "ui_app.h"即可。
資源
qt定義了一套它自己的資源使用方式,其資源定義文件形如*.qrc。
如圖ras.qrc文件其實就是一個xml文件,其中就包含了ras文件夾中的一些png文件。
用如下的命令可以將ras.qrc文件轉化成cpp代碼:
rcc.exe -no-compress ras.qrc -o ras.cpp
這樣在vs項目中添加ras.cpp文件后,就可以用如下的路徑來使用資源。
QIcon icon_app(":/ras/app.png");
大致地看一下ras.cpp的代碼,可以發現qt應該是將圖像的像素點轉化成c++字節數組進行存儲。
perl代碼批量轉化
上面說的這些命令,如果只是一個小項目,還可以去手動輸入一個個命令,如果是一個大項目,那如果手動的話就簡單是惡夢了。下面本人用perl實現了自動轉化功能。

1 use 5.010; 2 use warnings; 3 use strict; 4 5 sub main; 6 sub HaveQObject; 7 sub ui; 8 sub moc; 9 sub ras; 10 11 main; 12 13 sub main 14 { 15 say "\n**********moc**********"; 16 moc; 17 18 say "\n**********ui**********"; 19 ui; 20 21 say "\n**********ras**********"; 22 ras; 23 } 24 25 #將ui轉化為.h文件 26 sub ui 27 { 28 while (<*.ui>) { 29 my @fs = split /\./, $_; 30 my $h_file = "ui_$fs[0].h"; 31 system("uic $_ -o $h_file"); 32 33 say "create $h_file"; 34 } 35 } 36 37 #將有元信息的.h文件生成對應的.cpp文件 38 sub moc 39 { 40 while (<*.h>) { 41 my $f = $_; 42 if (HaveQObject($_)) { 43 my @fs = split /\./, $f; 44 my $c_file = "moc_$fs[0].cpp"; 45 system("moc.exe $f -o $c_file"); 46 47 say "create $c_file"; 48 } 49 } 50 } 51 52 sub HaveQObject 53 { 54 my $filename = $_[0]; 55 open FILE, $filename; 56 while (<FILE>) { 57 chomp; 58 s/^\s+//; 59 s/\s+$//; 60 if ("Q_OBJECT" eq $_) { 61 return 1; 62 } 63 } 64 return 0; 65 } 66 67 #將資源生成對應.h文件 68 sub ras 69 { 70 while (<*.qrc>) { 71 my $s = substr($_, 0, rindex($_, ".")); 72 my $c = "ras_$s.cpp"; 73 system("rcc -no-compress $_ -o $c"); 74 say $c; 75 } 76 }
其中moc函數,在先判斷如果某個.h文件中包括有Q_OBJECT則執行moc,
ui函數對*.ui文件進行轉化生成對應的*.h文件
ras函數對*.qrc文件進行轉化生成對應的*.cpp文件
去掉命令行窗口
一般c++的主函數是int main(int argc, char **argv),這里生成的exe在運行時會帶一個命令行窗口,在完成最終的產品時實現將其去掉。可以這樣在vs中進行設置:
"鏈接器-系統-子系統"中選擇Windows
"鏈接器-高級-入口點"設置為mainCRTStartup
這樣就去掉了命令行窗口