C/C++笔记-使用Qt的UI文件时make流程

这篇具有很好参考价值的文章主要介绍了C/C++笔记-使用Qt的UI文件时make流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先创建如下项目:

QtWidgetMakfileDemo.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    Widget.cpp

HEADERS += \
    Widget.h

FORMS += \
    Widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

main.cpp

#include "Widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

Widget.cpp

#include "Widget.h"
#include "ui_Widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

ui是空的。

此时运行命令qmake,然后再make,打印如下:

/opt/Qt5.5.1/5.5/gcc_64/bin/uic Widget.ui -o ui_Widget.h
g++ -c -pipe -O2 -std=c++0x -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets -I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ -o main.o main.cpp
g++ -c -pipe -O2 -std=c++0x -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets -I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ -o Widget.o Widget.cpp
/opt/Qt5.5.1/5.5/gcc_64/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ -I/root/CffPro/QtWidgetMakefileDemo -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets -I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore Widget.h -o moc_Widget.cpp
g++ -c -pipe -O2 -std=c++0x -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I/opt/Qt5.5.1/5.5/gcc_64/include -I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets -I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui -I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore -I. -I. -I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ -o moc_Widget.o moc_Widget.cpp
g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64/lib -o QtWidgetMakefileDemo main.o Widget.o moc_Widget.o   -L/opt/Qt5.5.1/5.5/gcc_64/lib -lQt5Widgets -L/usr/lib64 -lQt5Gui -lQt5Core -lGL -lpthread 

整体逻辑是这样的:

①将ui文件生成对应的C++的.h文件;

②将.cpp编译成.o文件;

③将带有Q_OBJECT和继承了QObject的类生成对应的moc_xxx.cpp文件;

④编译moc文件,生成对应的.o文件;

⑤链接所有.o文件以及动态库,生成可执行程序;

下面来分析下每个步骤:

/opt/Qt5.5.1/5.5/gcc_64/bin/uic Widget.ui -o ui_Widget.h

各个参数分析:

调用uic程序,将ui文件生成对应的ui_widget.h文件;

g++ -c -pipe -O2 -std=c++0x -Wall -W 
-D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/include 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore 
-I. 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ 
-o main.o main.cpp

各个参数分析:

-c:生成文件;

-pipe:在不同的编译阶段使用管道替代临时文件;

-O2:optimization优化,比-O高一级的优化,编译优化,具体优化哪些内容,在此不说明;

-std=c++0x:指定c++版本;

-Wall:编译后显示所有告警;

-W:默认报警也要显示;

-D_REENTRANT:它会对部分函数重新定义它们的可安全重入的版本;

-fPIC:用于生成位置无关的代码(Position-Independent-Code);

-DQT_NO_DEBUG:这个没查到,但看名称差不多能猜到是QT不使用Debug;

-DQT_CORE_LIB:这个没查到,但看名称差不多能猜到是QT核心库;

-DQT_GUI_LIB:这个没查到,但看名称差不多能猜到是QT的图形GUI库;

-I:表示包含的include文件;

-o:表示编译成object文件。

g++ -c -pipe -O2 -std=c++0x -Wall -W 
-D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/include 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore 
-I. 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ 
-o Widget.o Widget.cpp

各个参数分析:

和②步一样。

/opt/Qt5.5.1/5.5/gcc_64/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB 
-I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ 
-I/root/CffPro/QtWidgetMakefileDemo 
-I/opt/Qt5.5.1/5.5/gcc_64/include 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore Widget.h 
-o moc_Widget.cpp

各个参数分析:

和②步一样。

从中发现了个有意思的,以前都以为moc_xxx.cpp文件是通过对于的.h和.cpp使用moc联合生成的,现在发现他仅仅是使用对应的.h文件生成。具体moc_Wiget.cpp文件的内容在后面说明。

g++ -c -pipe -O2 -std=c++0x -Wall -W -D_REENTRANT 
-fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/include 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtWidgets 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtGui 
-I/opt/Qt5.5.1/5.5/gcc_64/include/QtCore 
-I. 
-I. 
-I/opt/Qt5.5.1/5.5/gcc_64/mkspecs/linux-g++ 
-o moc_Widget.o moc_Widget.cpp

各个参数分析:

和②步一样。

这里就很明确的发现了,在编译阶段,使用了Q_OBJECT和继承了QObject的类会编译时会生成2个object文件,分别是原始object和带moc的object文件。

g++ -Wl,-O1 -Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64 
-Wl,-rpath,/opt/Qt5.5.1/5.5/gcc_64/lib 
-o QtWidgetMakefileDemo main.o Widget.o moc_Widget.o   
-L/opt/Qt5.5.1/5.5/gcc_64/lib 
-lQt5Widgets 
-L/usr/lib64 -lQt5Gui -lQt5Core -lGL -lpthread 

各个参数分析:

-Wl, -rpath:①用于编译时指定间接引用的库位置,作用同-Wl,-rpath-link;②用于运行时指定所有引用库的位置,作用同修改环境变量(LD_LIBRARY_PATH),并且库路径引用优先级高于LD_LIBRARY_PATH;

-L:Link链接路径;

-l:链接到哪个so文件。文章来源地址https://www.toymoban.com/news/detail-449318.html

到了这里,关于C/C++笔记-使用Qt的UI文件时make流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt - .ui 文件的使用

    子目录只能输入英文,想要显示中文,可以修改右下方表中的 text 属性: 让工具栏共用 菜单栏的 new 和 open,只需将下方列表的控件,拖拽到工具栏。 添加分隔符 allowedAreas 设置允许停靠的位置。 可以通过 MainWindow.cpp 的 ui 属性,找到所有的控件。 添加 icon 资源 会创建 .qr

    2024年02月16日
    浏览(42)
  • qt中使用 ui 文件进行界面设计

    目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件,点击转到槽 6、根据实际需要选择对应的信号,我这里方便演示选择 clicked()信号,直接点击 OK 7、自动在

    2024年02月04日
    浏览(40)
  • qt打开项目缺少ui_文件,使用手动生成

    打开项目看到,缺少ui_myMainWindow.h文件,它是和myMainWindow.ui相对应的,所以我们需要手动生成对应的ui_文件。 步骤如下: 使用 uic.exe 来生成,如果在系统变量Path中设置了qt的bin目录,那么就可以直接使用uic.exe。 使用方法是: 在myMainWindow.ui所在文件夹的空白处点击右键,选择

    2024年02月11日
    浏览(43)
  • 【Qt】如何在Qt应用程序中使用设计好的UI文件

    本质上,Qt Designer的ui文件是一个以XML格式书写的文件,文件中内容描述了一个界面的widget关系树。这个文件在以下两种情况下会使用到: (1)在编译的时候,这意味着ui文件将被转换为可编译的c++代码,这个过程由 uic 完成。 (2)在应用程序运行的时候,ui文件将由 QUiLoa

    2024年01月16日
    浏览(45)
  • Qt/C++使用QUiLoader动态加载ui资源文件

    动态对话框(dynamic dialog)就是在程序运行时使用的从Qt设计师的.ui文件创建而来的那些对话框。动态对话框不需要通过uic把 .ui文件转换成C++代码,相反,它是在程序运行的时候使.用QUiLoader 类载人该文件的。 动态对话框使不重新编译应用程序而可以改变窗体布局的做法成为可能。

    2024年02月21日
    浏览(45)
  • QT Designer 生成的ui文件转化成py文件以及简单使用

    首先用QTdesigner 设计你的界面 然后保存成.ui文件 这一步大家应该都可以做到,就不细讲了 然后就是转换步骤 使用cmd进入ui所在目录 或者在pycharm项目里的终端进入ui所在目录 然后输入下列语句 这里的outputUI就可以替换成你想要的输出文件名 InputUI就是你想要转换的ui文件名 稍

    2023年04月08日
    浏览(49)
  • C/C++笔记-分析带有Q_OBJECT继承QObject的类make流程

    此篇博文记录到个笔记时间2023-02-15,发表到网上的时间是2023-05-03。 这里以Qt5.5.1为例,操作系统是centos 7.5版本。 代码如下: MOCQtConsole.pro Test.h Test.cpp main.cpp 使用qmake生成好makefile文件后,make下:   运行截图如下:  下面逐条分析下流程: ①编译main.cpp,生成对应的object文件

    2024年02月05日
    浏览(32)
  • Qt中如何在qml文件中使用其他的qml文件并创建对象

    如果想使用其他的qml文件直接创建对象,必须先这样导入其qml文件并as成别名,才可以创建对象并使用它。 一、导入qml文件,例如: 二、使用别名创建对象 三、使用创建的对象 秋风写于淄博,业务交流与技术咨询:Q375172665

    2024年02月12日
    浏览(48)
  • 将 Qt Designer 的 ui 文件转换为 PySide2 使用的.py 文件

    20201206 修订:在 Pyside2 的 5.15.2 版本中,从 ui 生成 py 文件过程,命令从 “uic” 变为 “pyside2-uic” Qt Designer 设计的 ui 文件,就是一个 xml 文件,通过 pyside-uic 可以转换成标准的.py 文件 。通过 QtDesigner 创建的 ui 如图: 我们切入正题: 1:首先要保证将 pyside2-uic.exe 加到环境变

    2024年02月07日
    浏览(50)
  • PyQt6 使用Qt Designer实现简单的界面,以及ui文件转py文件

    前言,主要通过参考并总结两篇文章中的部分内容,参考文章一 参考文章二 新增一个用户注册界面,包含用户名,密码,性别,手机号,点击注册按钮时,弹出一个对话框,提示恭喜 “{用户输入的用户名}” 注册成功。但是无奈还没找出获取最新输入用户名的值,就简单做

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包