標籤:
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 main14 {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 ui27 {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 moc39 {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 HaveQObject53 {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 ras69 {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 }qt.pl
其中moc函數,在先判斷如果某個.h檔案中包括有Q_OBJECT則執行moc,
ui函數對*.ui檔案進行轉化產生對應的*.h檔案
ras函數對*.qrc檔案進行轉化產生對應的*.cpp檔案
去掉命令列視窗
一般c++的主函數是int main(int argc, char **argv),這裡產生的exe在運行時會帶一個命令列視窗,在完成最終的產品時實現將其去掉。可以這樣在vs中進行設定:
"連結器-系統-子系統"中選擇Windows
"連結器-進階-進入點"設定為mainCRTStartup
這樣就去掉了命令列視窗
只用vs2008寫qt程式