首页 前端知识 Linux上位机开发实战(qt编译之谜)

Linux上位机开发实战(qt编译之谜)

2025-03-20 12:03:51 前端知识 前端哥 389 412 我要收藏

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        很多同学都喜欢用IDE,也能理解。因为不管是visual studio qt插件,还是qt creator其实都帮我们做了很多额外的工作。这里面最重要的部分,就是利用uic、moc和rcc命令帮我们生成了额外的h文件、moc cpp文件、qrc cpp文件。换句话说,这些操作对我们来说都是透明的。但只要我们了解清楚了里面的原理,就会发现其实就是那么回事。

1、uic命令

        我们都知道,qt的图形界面就是ui文件。ui文件一般用qt designer生成。那么ui文件怎么和具体的class绑定在一起呢?方法就在uic工具,一般用uic可以直接生成h头文件,类似于这样,

uic QtWidgetsApplication.ui -o ui_QtWidgetsApplication.h

        有了这个ui_QtWidgetsApplication.h头文件之后,我们就可以在QtWidgetsApplication.h里面自由使用ui对象里面的控件了,

#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication.h"

class QtWidgetsApplication : public QMainWindow
{
    Q_OBJECT

public:
    QtWidgetsApplication(QWidget *parent = nullptr);
    ~QtWidgetsApplication();

private:
    Ui::QtWidgetsApplicationClass ui;
};

2、moc命令

        刚才分析QtWidgetsApplication类的时候,不知道大家有没有注意,这里面还包含了一个Q_OBJECT宏。通过这个宏以及moc命令,qt就可以帮我们生成额外的cpp代码。例如,我们使用qt的时候很方便,直接把控件和slot槽函数做一个connect就可以了。但是具体怎么调用的,其实是moc自动生成的cpp文件来完成的,

INCLUDE_DIR=-I /usr/include/aarch64-linux-gnu/qt5 \
            -I /usr/include/aarch64-linux-gnu/qt5/QtWidgets\
            -I /usr/include/aarch64-linux-gnu/qt5/QtGui \
            -I /usr/include/aarch64-linux-gnu/qt5/QtCore

moc_QtWidgetsApplication.o : moc_QtWidgetsApplication.cpp
	g++ -g -c moc_QtWidgetsApplication.cpp -o moc_QtWidgetsApplication.o $(INCLUDE_DIR)

moc_QtWidgetsApplication.cpp : QtWidgetsApplication.h
	moc -o moc_QtWidgetsApplication.cpp QtWidgetsApplication.h

        生成的moc_QtWidgetsApplication.cpp最终也要链接到可执行文件里面去的。

3、rcc命令

        除了上面说的ui文件、Q_OBJECT宏处理,还有一种qrc文件也需要进行处理。这种qrc文件,类似于原来windows系统里面的rc资源文件。qt一般是通过rcc命令,把它变成cpp文件来处理。这样就可以同样链接到最终可执行文件中去了。

INCLUDE_DIR=-I /usr/include/aarch64-linux-gnu/qt5 \
            -I /usr/include/aarch64-linux-gnu/qt5/QtWidgets\
            -I /usr/include/aarch64-linux-gnu/qt5/QtGui \
            -I /usr/include/aarch64-linux-gnu/qt5/QtCore

obj/qrc_QtWidgetsApplication.o: qrc_QtWidgetsApplication.cpp
	g++ -c -g qrc_QtWidgetsApplication.cpp -o obj/qrc_QtWidgetsApplication.o $(INCLUDE_DIR)

qrc_QtWidgetsApplication.cpp:
	rcc  QtWidgetsApplication.qrc -o qrc_QtWidgetsApplication.cpp

4、总结

        qt程序的编译,其实没有脱离常见的编译法则,比如编译、链接、静态库、动态库、可执行文件。只是很多操作都被隐藏掉了,比如这里说的uic、moc、rcc命令。我们常用的visual studio qt插件,或者是qt creator,都默认帮我们做了这些工作,这才导致我们并不是很清楚qt的编译原理。等到明白过来之后,其实就可以自由地编写Makefile,自由地去组织文件的编译和生成了。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/24219.html
标签
评论
发布的文章

动态规划感悟1

2025-03-20 12:03:52

华为NAS真实测评!

2025-03-20 12:03:52

Java设计模式之代理模式

2025-03-20 12:03:51

Linux 锁、线程同步

2025-03-20 12:03:48

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!