qt的moc,uic,rcc命令的使用


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 }
qt.pl

其中moc函數,在先判斷如果某個.h文件中包括有Q_OBJECT則執行moc,

ui函數對*.ui文件進行轉化生成對應的*.h文件

ras函數對*.qrc文件進行轉化生成對應的*.cpp文件

去掉命令行窗口

一般c++的主函數是int main(int argc, char **argv),這里生成的exe在運行時會帶一個命令行窗口,在完成最終的產品時實現將其去掉。可以這樣在vs中進行設置:

"鏈接器-系統-子系統"中選擇Windows

"鏈接器-高級-入口點"設置為mainCRTStartup

這樣就去掉了命令行窗口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM