沉沉的黑夜都是白天的前奏。——郭小川


舍弃IDE或qmake、cmake等工具的束缚,通过几个例子, 一步步从标准 C++ 的编译过渡到 Qt 的编译。

Qt 对 C++ 的扩展主要是3个方面:

  1. 1)元对象系统,包含Q_OBJECT宏的文件(.h, .cpp等)需要 moc 预处理
  1. 2)资源系统,.qrc 文件 需要 rcc 进行预处理
  1. 3)界面系统,.ui 文件 需要 uic 进行预处理

这3者之中,元对象系统最复杂,也是 Qt 程序中重要的。 Qt5增加的qml也是一个亮点!


例子一:简单的控制台程序

  1. #include <QtCore/QCoreApplication>
  2. #include <QtCore/QDebug>
  3. int main(int argc, char** argv)
  4. {
  5. //#QApplication这个类是继承QCoreApplication的,而QCoreApplication有继承QObject的,//而QObject就是QT中最基本
  6. //#的基类,也就是QT的根基了. QCoreApplication class is used by non-GUI applications to provide their event loop.
  7. // http://doc.qt.io/qt-5/qcoreapplication.html#details
  8. QCoreApplication app(argc, argv);
  9. qDebug()<<"hello qt!";
  10. app.exec();
  11. }

一个很简单的例子,没用到Qt扩展:(也就是说,这是一个普通的C++程序)。

我们都知道,编译一个C++的程序,无非是 编译预处理,编译、链接

编译预处理器:头文件路径 和 必要的宏

编译器:一些编译参数

链接器:一些链接参数 和 要链接的库

# use g++

简单一行命令,即可生成 main.exe (linux下,则生成可执行程序 main)

g++ main.cpp -DQT_CORE_LIB -Ie:\Qt\4.7.0\include -o main -Le:\Qt\4.7.0\lib -lQtCore4

单行命令,很简单:

  -I 指定头文件路径

    -L 指定库文件路径

    -l 指定需要链接的库

    -D 定义必要的宏(其实对这个小程序,这个宏也没必要用)

    -o 指定生成的可执行文件名

# use cl

简单一行命令,即可生成 main.exe

cl main.cpp -ID:/Qt/4.7.0/include -DQT_CORE_LIB -Femain -link -LIBPATH:D:/Qt/4.7.0/lib QtCore4.lib

依然很简单

 -I 头文件路径

    -D 定义必要的宏

    -Fe 指定可执行程序文件名

    -link 后面是链接器参数

    -LIBPATH 库文件路径


# 例子二:简单的GUI程序

这次稍微复杂一点,不是单一的控制台程序,而是一个简单的GUI程序 :

  1. //main.cpp :
  2. #include <QtGui/QApplication>
  3. #include "widget.h"
  4. int main(int argc, char** argv)
  5. {
  6. QApplication app(argc, argv);
  7. Widget w;
  8. w.show();
  9. return app.exec();
  10. }
  11. ///////////////////
  12. //widget.h file:
  13. #include <QtGui/QWidget>
  14. class Widget : public QWidget
  15. {
  16. public:
  17. Widget(QWidget * parent=NULL);
  18. };
  19. //widget.cpp
  20. #include "widget.h"
  21. Widget::Widget(QWidget * parent)
  22. :QWidget(parent)
  23. {
  24. }

同样,这个程序未使用Qt的扩展,直接用C++的编译器编译:g++

g++ main.cpp widget.cpp -DQT_CORE_LIB -DQT_GUI_LIB -Ie:\Qt\4.7.0-beta2\include -o main -Le:\Qt\4.7.0-beta2\lib -lQtCore4 -lQtGui4

因为我们使用了QtGui模块,所以和前面相比:

增加了 -DQT_GUI_LIB 和 -lQtGui4

   多了一个文件 widget.cpp


例子三:引入moc

Qt 对 C++ 的扩展主要是3个方面:

元对象系统,包含Q_OBJECT宏的文件(.h, .cpp等)需要 moc 预处理

资源系统,.qrc 文件 需要 rcc 进行预处理

界面系统,.ui 文件 需要 uic 进行预处理

这3者之中,元对象系统最复杂,也是 Qt 程序中重要的。其他两个你都可以不要,唯独这个不要就有点不像话了(没它还叫Qt程序么?像我们前面写的,只不过是普通的C++程序)

修改前面的widget.h,加入Q_OBJECT宏:

#include <QtGui/QWidget>

class Widget : public QWidget

{

Q_OBJECT

public:

Widget(QWidget * parent=NULL);

};

如何编译这个程序呢?例子二中的命令不能使用了!

添加一个宏后,发生了什么?我们看看 编译器将加入Q_OBJECT宏展开 后是什么样子的:

#include <QtGui/QWidget>

class Widget : public QWidget

{

    static const QMetaObject staticMetaObject;

    virtual const QMetaObject *metaObject() const;

    virtual void *qt_metacast(const char *);

    virtual int qt_metacall(QMetaObject::Call, int, void **);

    ...

public:

    Widget(QWidget * parent=NULL);

};

编译器在预处理时会将加入Q_OBJECT宏展开,展开后相当于定义了许多函数,一下子多出来这么多函数,而且还没有函数体。

如何生成函数体呢?这正是moc所做的:

moc widget.h -o moc_widget.cpp

这样一来,这些函数都在 moc_widget.cpp 被实现了,只要我们将该文件一块编译链接就行了。

对g++来说,在例子二的基础上,直接添加一个 moc_widget.cpp 文件,然后一切正常了:

g++ main.cpp widget.cpp moc_widget.cpp -DQT_CORE_LIB -DQT_GUI_LIB -Ie:\Qt\4.7.0-beta2\include -o main -Le:\Qt\4.7.0-beta2\lib -lQtCore4 -lQtGui4


例子四:rcc和uic

本节中不讲例子(因为 rcc 和 uic 概念比较简单)

如果我们用了资源,那么需要一个 xxx.qrc 文件,这个文件呢,C++ 编译器不认识,于是

rcc xxx.qrc -o qrc_xxx.cpp

如果我们用了designer设计的界面 .ui。C++ 编译器不认识这个文件,于是

uic xxx.ui -o ui_xxx.h

这样一来,我们得到是就全是 .h 和 .cpp 的文件了,剩下的工作,你知道的,交给 C++ 编译器就行了。


最后理解一下qt的编译工具:

Ref:

https://blog.csdn.net/luoqindong/article/details/53469909

Qt编译理解(Qt 对 C++ 的扩展主要是3个方面)的更多相关文章

  1. Qt编译mysql以及创建表后进行导入操作

    鉴于很多同学对Qt编译myql总是不能成功.出现各种问题,今天特此写出本教程,希望可以帮到须要的同学.        首先,须要明确编译的目的和原理. 目的:Qt 5.2版本号曾经都是不带mysql驱 ...

  2. Linux编译安装Qt 5.4.1(-qt-xcb是必须要指定的,卸载自带的gcc等)

    转载请注明文章:Linux编译安装Qt 5.4.1 出处:多客博图 很久不写文章了,过程很简单,但是操作很多,简单说吧. 前言: 操作系统CentOS 6.6,64位的. 1.安装gcc 4.8.4, ...

  3. QT编译./configure参数的详细解释

    可以随便的转载,只要按照规矩走带上咱论坛的链接就好. ======================================全文是按照./configure -help来翻译的========= ...

  4. Qt编译安装qwt错误moc/xxx Error:126

    最近搞设计,需要在上位机上绘制曲线,在网上找了找,发现python的matplotlib和Qt的qwt都不错,本着难度最小原则,选择了Qt下面的qwt,安装过程中遇到了编译错误:moc/xxx Err ...

  5. osg,qt编译的一些问题

    osg编译例子的时候,打开文件就出问题,可能是一些不兼容的问题 qt编译的是时候要添加qt和vs2010的整合工具,这样才能把 vs2010里面的QTDIR变量和环境变量QTDIR关联起来 同是右击文 ...

  6. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  7. Solaris 10下Qt编译Oracle 10g驱动

    上回书讲到<Oracle 10g在Solaris 10中安装详解>,现在开始用Qt来编译下Oracle 10g驱动吧!这样就可以通过Qt程序联入Oracle数据库了! Oracle的环境变 ...

  8. Qt编译安装后中文无法显示问题

    闲的蛋疼,把Ubuntu删了,再装10.04的时候,QT编译后运行自己的程序已经不能显示中文了,只能显示英文,字体贼丑... 想了各种办法,都没解决.. 最后:终于搞定: apt-get instal ...

  9. 在CentOS下面编译WizNote Qt Project

    编译环境 CentOS 64位 Desktop 版本:6.5 编译前的准备: CentOS的用户默认没有root权限,如果当前用户没有权限root,则可以在终端里面执行下面的命令: su root s ...

随机推荐

  1. 基于Centos7+Flask+Nginx+uWSGI+Python3的服务器网页搭建教程

    之前完成了贴吧签到系统的搭建,笔者想将这个功能分享给更多人使用,所以尝试搭建了一个网页,一路遇到了很多问题,最终解决了,记录下过程分享给大家 首先安装 uWSGI ,和 Nginx 配套使用,具体用途 ...

  2. vant - Navbar slot 插槽使用

    //子组件 <template> <van-nav-bar> <slot slot="left" name="left">& ...

  3. 原生js打地鼠

    我们要做的是一个打地鼠的游戏,只用原生js 1.导入需要的图片 2.编写页面css样式demo.css *{ margin:0; padding:0; } .game{ position: relat ...

  4. Python 05 Geany的基本使用1

    问题01:代码中包含中文编译时提示错误 原文:https://blog.csdn.net/weixin_43345286/article/details/82951698 解决:文档 - 设置文件编码 ...

  5. fake_useragent 本地运行各种报错解决办法

  6. CF468C 【Hack it!】

    构造题果然都非常神仙啊 首先翻译有点问题,\(L, R\)的范围应该为\([1, 10^{200}]\) 由于模数a达到了\(10^{18}\),所以我们可以发现,当\(i<10^{18}\)时 ...

  7. 干货 | 10分钟掌握branch and cut(分支剪界)算法原理附带C++求解TSP问题代码

    00 前言 branch and cut其实还是和branch and bound脱离不了干系的.所以,在开始本节的学习之前,请大家还是要务必掌握branch and bound算法的原理. 01 应 ...

  8. async、await总结

    一.async用法 async作为一个关键字放到函数前面,用于表示函数是一个异步函数.异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 异步函数语法很简单,就是在函数前面加上async 关键字, ...

  9. err Invalid input of type: 'dict'. Convert to a byte, string or number first

    一个问题引发的血案: 用python向redis写入数据报错: redis.exceptions.DataError: Invalid input of type: 'dict'. Convert t ...

  10. USACO 重排干草&&BZOJ1045

    USACO 重排干草&&BZOJ1045 Description 约翰订购了很多干草,他在农场里标记了 N 个位置.这些位置近似地构成一个圆环.他原打算 让送货司机在 i 号位卸下 B ...