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 " **********moc**********"; 16 moc; 17 18 say " **********ui**********"; 19 ui; 20 21 say " **********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
这样就去掉了命令行窗口