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⽂件,命令如下
< myclass.h -o mac_myclass.cpp
其中myclass.h中有类有Q_OBJECT属性。在vs项⽬中只需要添加mac_myclass.cpp⽂件即可。
UI
虽然不使⽤designer来设计界⾯,但在编译⼀个demo项⽬时都会⽤*.ui⽂件,这时得先将其⽤进⾏转化
< 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代码:
< -no-compress ras.qrc -o ras.cpp
这样在vs项⽬中添加ras.cpp⽂件后,就可以⽤如下的路径来使⽤资源。
QIcon icon_app(":/ras/app.png");
⼤致地看⼀下ras.cpp的代码,可以发现qt应该是将图像的像素点转化成c++字节数组进⾏存储。
perl代码批量转化
上⾯说的这些命令,如果只是⼀个⼩项⽬,还可以去⼿动输⼊⼀个个命令,如果是⼀个⼤项⽬,那如果⼿动的话就简单是恶梦了。下⾯本⼈⽤perl实现了⾃动转化功能。
1use5.010;
2use warnings;
3use strict;
4
5sub main;
6sub HaveQObject;
7sub ui;
8sub moc;
9sub ras;
10
11main;
12
13sub 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⽂件
26sub ui
27{
28while (<*.ui>) {
29my@fs = split /\./, $_;
30my$h_file = "ui_$fs[0].h";
31system("uic $_ -o $h_file");
32
33        say "create $h_file";
34    }
35}
input命令36
37#将有元信息的.h⽂件⽣成对应的.cpp⽂件
38sub moc
39{
40while (<*.h>) {
41my$f = $_;
42if (HaveQObject($_)) {
43my@fs = split /\./, $f;
44my$c_file = "moc_$fs[0].cpp";
45system(" $f -o $c_file");
46
47            say "create $c_file";
48        }
49    }
50}
51
52sub HaveQObject
53{
54my$filename = $_[0];
55open FILE, $filename;
56while (<FILE>) {
57chomp;
58        s/^\s+//;
59        s/\s+$//;
60if ("Q_OBJECT" eq $_) {
61return1;
62        }
63    }
64return0;
65}
66
67#将资源⽣成对应.h⽂件
68sub ras
69{
70while (<*.qrc>) {
71my$s = substr($_, 0, rindex($_, "."));
72my$c = "ras_$s.cpp";
73system("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
这样就去掉了命令⾏窗⼝