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

    其中moc函数,在先判断如果某个.h文件中包括有Q_OBJECT则执行moc,

    ui函数对*.ui文件进行转化生成对应的*.h文件

    ras函数对*.qrc文件进行转化生成对应的*.cpp文件

    去掉命令行窗口

    一般c++的主函数是int main(int argc, char **argv),这里生成的exe在运行时会带一个命令行窗口,在完成最终的产品时实现将其去掉。可以这样在vs中进行设置:

    "链接器-系统-子系统"中选择Windows

    "链接器-高级-入口点"设置为mainCRTStartup

    这样就去掉了命令行窗口

  • 相关阅读:
    PostgreSQL中enable、disable和validate外键约束
    npm 安装依赖 以及dependencies 和 devDependencies的区别
    Vue2.0项目工程升级3.0
    npm : 无法加载文件 D:Program Files odejs ode_global pm.ps1,因为在此系统上禁止运行脚本。
    有搜索功能的下拉框插件chosen.jquery.js
    jsplumb vue 流程设计器页面
    QRCoder生成二维码
    jquery.jCal.js显示日历插件
    组织架构树后端逻辑
    JavaScript InfoVis Toolkit Jit中的SpaceTree 展现组织结构图
  • 原文地址:https://www.cnblogs.com/xiangism/p/4621108.html
Copyright © 2020-2023  润新知