QT6学习第四天 感受QT的文件编译
QT6学习第四天 感受QT的文件编译
- 使用纯代码编写程序
- 新建工程
- 使用其他编辑器纯代码编写程序并在命令行运行
- 使用 .ui 表单文件生成界面
- 使用自定义 C++ 窗口类
- 使用现成的QT Designer界面类
使用纯代码编写程序
我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局,同时也会生成代码。
我们来练习纯代码方式来写项目。
新建工程
我们新建一个空项目

因为书里写的使用Qmake的,我也就用QMake了。CMake你需要了解CMake文件的编写。
创建完成后,会生成一个pro文件,我们在里面写上
greaterThan(QT_MAFOR_VERSION,4):
QT += widgets
因为我们的代码中需要用到的类都包含在Widgets这个模块中。所以在编译文件中要写。
在项目中添加一个main.cpp文件。

在 main.cpp 中写上我们的代码。
//导入我们要使用的包或类
#include <QApplication>
#include <QDialog>
#include <QLabel>//main函数带有两个参数,第一个是个变量,第二个是一个数组
int main(int argc,char *argv[]){//创建一个 QApplication 对象,来管理应用程序的资源,//每个 QT Widgets 程序都有一个QApplication 对象。//因为QT程序可以接受命令行参数,所以需要 argc 和 argv 俩参数。QApplication a(argc,argv);//创建一个 QDialog 对象 w ,QDialog 类用来实现一个对话框界面QDialog w;//设置w的长宽w.resize(400,300);//创建一个 QLabel 对象 label,第一个参数是 &w 说明将他放在 w 中,& 表示用了引用。QLabel label(&w);//设置 label 的位置,原点是(0,0)label.move(120,120);//设置 label 要显示的字符//QOBject::tr() 可以实现多语言支持,建议所有要显示到界面的字符都用它括起来label.setText(QObject::tr("Hello World! Hello QMake!"));//显示创建的对象,QT 中的对象需要用 show() 才会显示出来。w.show();//让QApplication 对象进入事件循环中,这样 QT 程序运行时便可以接受产生的事件//如鼠标单击、按键盘等。return a.exec();
}
这样我们就自己写了一个超级low的QT程序啦!
运行它吧
使用其他编辑器纯代码编写程序并在命令行运行
我们试试不用QT Creator 使用普通文本编辑器来写程序。通过对比,让大家明白QT Creator只是将编辑、编译、运行等动能进行了集成,其实这些操作都可以我们自己实现,可在帮助索引中通过 Getting Started with qmake关键字查看该部分内容。
我们来新建一个项目。自己找一个路径,在路径下创建一个文本文档,并把我们之前的代码复制过来,最后将文件另存为 main.cpp 编码选择UTF-8,否则中文会乱码。
然后我们开始编译。打开QT 6.8(MinGW 13.1.0 64)命令行,进入我们项目路径,然后输入qmake-project命令来生成 .pro 项目文件。
在 pro 文件中输入
greaterThan(QT_MAJOR_VERSION,4):QT += widget
下面接着在命令行中输入 qmake 命令来生成用于编译的Makefile 文件。之后会出现Makefile 文件、debug和release目录。最后再输入 mingw32-make 命令来编译程序,编译完成后会在 release 文件夹中生成 .exe 文件。如果要生成debug版,只需改变下命令即可。
这里对QT程序的编译过程做一个补充。qmake 是QT提供的编译工具,它可以生成与平台无关的 .pro 文件,然后利用该文件生成与平台相关的 Makefile 文件。Makefile 文件中包含了要创建的目标文件或可执行文件、创建目标文件所依赖的文件和创建每个目标文件时需要运行的命令等信息。最后用 mingw32-make 工具完成自动编译,mingw32-make 就是通过读入 Makefile 文件的内容来执行编译。使用 mingw32-make 时会为每个源文件生成一个对应的 .o 文件,最后将这些目标文件进行链接来生成最终的 .exe 文件。
通过上面的小案例,更能理解QT Creator 是一个将项目目录管理、源代码编辑和程序编译运行等功能集合在一起的集成开发环境(IDE)。
使用 .ui 表单文件生成界面
我们在项目里添加一个 ui 文件,用 ui 文件生成界面来替代前面代码生成的界面,并讲解 ui 文件的作用。然后脱离QT Creator,使用命令行再次编译 ui 文件和整个项目。可以在帮助索引中通过 Using a Designer UI File in Your C++ Application 关键字查看相关内容。
像我们之前添加 main.cpp 文件一样,添加 ui 文件。然后起个名字。


添加完成后会直接进入设计模式。在界面上拖入一个 Label 部件,并更改其显示内容为 Hello QT!。然后通过右侧的属性编辑器,在geometry属性中更改坐标位置为 X:120,Y:120。这样就和我们的代码 label.move(120,120) 一致了。接着在右上角的对象查看器中选择QDialog类对象,并在属性编辑器中更改对象名为 Hello QT

我们回到编辑模式,会看到 ui 文件生成了,其实她是一个 xml 代码文件,里面的代码就是我们设计的界面信息。
我们点击锤子图标构建项目。能发现在 build/debug 路径下生成了 ui 的 .h 头文件。可以看一下里面的内容。
/********************************************************************************
** Form generated from reading UI file 'dialog.ui'
**
** Created by: Qt User Interface Compiler version 6.8.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************///预处理指令,防止对这个头文件的多重包含
#ifndef UI_DIALOG_H
#define UI_DIALOG_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>//命名空间开始宏
QT_BEGIN_NAMESPACE//定义一个Ui_HelloQT类,在ui文件中设置的对象名前加了Ui,默认的格式
class Ui_HelloQT
{
public:
//一个QLabel类对象指针,就是ui中添加的Label部件QLabel *Hello;//生成界面的函数,参数类型由我们创建项目时选择的模板决定,这里是Dialogvoid setupUi(QDialog *HelloQT){//设置Dialog名字if (HelloQT->objectName().isEmpty())HelloQT->setObjectName("HelloQT");HelloQT->setEnabled(true);//在HelloQT中创建QLabel对象Hello = new QLabel(HelloQT);//设置label名字Hello->setObjectName("Hello");//设置label位置和大小Hello->setGeometry(QRect(120, 120, 69, 19));//调用retranslateUi函数retranslateUi(HelloQT);//connectSlotsByName是个静态函数,可以让窗口中的部件实现按对象名进行信号和槽的关联。QMetaObject::connectSlotsByName(HelloQT);} // setupUi//定义retranslateUi函数,作用是对窗口里的字符进行编码转换void retranslateUi(QDialog *HelloQT){HelloQT->setWindowTitle(QCoreApplication::translate("HelloQT", "Dialog", nullptr));Hello->setText(QCoreApplication::translate("HelloQT", "TextLabel", nullptr));} // retranslateUi};//定义了命名空间 Ui,其中定义了一个 HelloQT 类,该类继承自 Ui_HelloQT 类
namespace Ui {class HelloQT: public Ui_HelloQT {};
} // namespace Ui//命名空间结束宏
QT_END_NAMESPACE//和第10、11行一起的,配对使用
#endif // UI_DIALOG_H
这里就不难理解,通过 ui 设计界面和纯代码设计界面,效果是一样的,通过 QT Designer 可以直观看到界面,省去写代码的过程。
我们改一下 main.cpp 文件,导入我们的 ui 头文件。并把我们的ui界面添加进去。
#include <ui_dialog.h>int main(int argc,char *argv[]){Ui::HelloQT ui;ui.setupUi(&w);
}
我们来看下在命令行中如何编译带ui的项目。和之前一样,需要把 cpp 和 ui 文件放到一起。
首先编译 ui 文件,还是打开QT 6.8.0(MinGW),进入到目录中,使用 uic 工具编译 ui 文件
输入 uic -o ui_dialog.h dialog.ui 完成后就会生成对应头文件
然后输入 qmake -project 生成 pro 文件,文件中添加 QT += widgets 后
再依次执行如下命令
qmake
ming32-make
这样我们也了解到通过命令行如何编译带 ui 的项目了。
使用自定义 C++ 窗口类
新建一个 qmake 空项目,并且建立一个自定义的 C++ 类,然后使用前面的 ui 文件。通过该示例可感受到QT Creator 中的 Designer 界面类是如何生成的。
- 创建一个空项目名为,helloworld,完成后打开 pro 文件并写入代码并保存。
greaterThan(QT_MAJOR_VERSION,4):QT += widgets
- 添加文件。添加 C++ Class 文件,类名为 HelloDial,基类选择自定义,手动填写为 QDialog,其他默认,完成后再添加新的 main.cpp 文件。

- 在 main.cpp 中填写代码
#include <QApplication>
#include "hellodialog.h"int main(int argc,char *argv[]){QApplication a(argc,argv);HelloDialog w;w.show();return a.exec();}
- 添加 ui 文件,将之前的 ui 文件复制过来,然后选择添加现有文件,选择 之前的 ui 文件。
- 更改C++类文件。这次没有在main函数中使用 ui 文件,而是在新建的 C++ 类中使用。
- 先改 hellodialog.h
#ifndef HELLODIALOG_H
#define HELLODIALOG_H#include <QDialog>
//这里是对 HelloDialog 类的前置声明,这样就不用在这里导入 ui_hellodialog.h 头文件了
//在 hellodialog.cpp 中导入即可
namespace Ui{
class HelloDialog;
}class HelloDialog : public QDialog
{//Q_OBJECT宏,扩展了普通C++类的功能,如信号和槽,必须在类定义最开始的部分添加Q_OBJECTpublic://显示构造函数,参数用来指定父窗口explicit HelloDialog(QWidget *parent = nullptr);~HelloDialog();private:Ui::HelloDialog *ui;
};#endif // HELLODIALOG_H
接着改 hellodialog.cpp
#include "hellodialog.h"
#include "ui_helloworld.h"//ui(new Ui::HelloDialog) 等同于 ui = new Ui::HelloDialog;
HelloDialog::HelloDialog(QWidget *parent):QDialog(parent),ui(new Ui::HelloDialog) {ui -> setupUi(this);
}HelloDialog::~HelloDialog(){delete ui;
}
使用现成的QT Designer界面类
-
新建一个空项目,名字还是helloworld,在pro文件中添加 greaterThan(QT_MAJOR_VERSION,4):QT += widgets
-
项目中添加新文件,模板选择QT Widgets Designer Form Class
-
添加一个main.cpp文件,添加代码
#include <QApplication>
#include "dialog.h"int main(int argc,char *argv[]){QApplication a(argc,argv);Dialog w;w.show();return a.exec();
}
它实现和我们刚刚一样的项目。
我们可以得到总结,QT Desiger 类界面项目,就是C++类和ui的结合,他会帮你生成cpp、h、ui文件,不用你自己创建。
相关文章:
QT6学习第四天 感受QT的文件编译
QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局,…...
透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)
一、透视投影 1.方法概述 Perspective projection(透视投影)是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中,远处的物体看起来比近处的物体小&…...
5 Java字符串操作
字符串操作 1、String类1.1 声明字符串1.2 创建字符串 1.3 字符串连接 /连接字符串连接其他数据类型 1.4 提取字符串信息获取字符串长度length()获取指定位置的字符 charAt()获取子字符串索引位置 indexOf()判断字符串首尾内容 startsWith()/endsWith()获取字符数组 toCharArra…...
【C++习题】17.二分查找算法_二分查找
文章目录 二分查找算法简介题目链接:题目描述:解法C 算法代码:图解总结朴素二分模板 二分查找算法简介 特点: 二分查找算法,是最恶心,细节最多,最容易写出死循环的算法。(而且非常难…...
Spring Boot英语知识网站:架构与开发
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...
Unity ShaderLab 实现网格爆炸
实现思路: 沿着3D物体每个面的法线,将面偏移一定的位置。 Shader Graph实现如下: Shader Lab 实现如下: Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…...
2024/11/28学习日志
为了更好地记录并反思自己的学习状况,将每日学习的内容、时长、心得等记录于此日志。 于9月3日开始记录,计划每日记录,希望至少能够坚持一个学期。 学习内容: 数据结构: 拓扑排序。关键路径。 马原: 马…...
在shardingsphere执行存储过程
环境: springboot:2.5.2 数据库:Kingbase金仓V8R6 依赖: <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId></depende…...
1.文件目录操作
目录 🍌 ls - 列出目录内容 🍉cp - 复制文件或目录 🍇mv - 移动或重命名文件 🍓 cd - 切换目录 🍈 pwd - 打印工作目录 🍒mkdir - 创建目录 🍑 rmdir - 删除空目录 🥭 touc…...
Vue单页面应用和多页面应用
在 Vue.js 中,“单页面”(SPA,Single Page Application)和"多页面"(MPA,Multi Page Application)是两种不同的应用结构,它们的差异主要体现在页面的加载方式、路由的使用、…...
Lombok :简化 Java 编程的得力工具
在 Java 开发过程中,常常需要编写大量的样板代码,例如构造函数、Getter 和 Setter 方法、equals 和 hashCode 方法等。这些代码虽然逻辑相对固定,但编写起来却较为繁琐且容易出错,并且会使代码显得冗长。Lombok 应运而生ÿ…...
AIGC引领金融大模型革命:未来已来
文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC(Artificial Intellige…...
DBA面试题-1
面临失业,整理一下面试题,找下家继续搬砖 主要参考:https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1, 整形 tinyint,smallint,medumint,int,bigint;分别占用1字节、2字节、3字节…...
用go语言写一个小服务
文章目录 简介重新想到go 小服务main.go部署测试 结束语 简介 golang的优势 响应速度: Go > Java > Python 内存占用: Go < Java < Python 从java转go,然后go又转java,感觉就是go虽然在编译、内存占用都强于java&am…...
亚马逊开发视频人工智能模型,The Information 报道
根据《The Information》周三的报道,电子商务巨头亚马逊(AMZN)已开发出一种新的生成式人工智能(AI),不仅能处理文本,还能处理图片和视频,从而减少对人工智能初创公司Anthropic的依赖…...
WordCloud参数的用法:
-------------词云图集合------------- 用WordcloudPyQt5写个词云图生成器1.0 WordCloud去掉停用词(fit_wordsgenerate)的2种用法 通过词频来绘制词云图(jiebaWordCloud) Python教程95:去掉停用词词频统计jieba.toke…...
qml调用c++类内函数的三种方法
一.方法一:使用 Q_INVOKABLE 宏声明成员函数 1.第一步:依然需要新建一个类NetworkHandler: #include <QObject> class NetworkHandler : public QObject { Q_OBJECT public: explicit NetworkHandler(QObject *parent nullptr); Q_INVOKAB…...
NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)
引言:从TF-IDF到Prompt-Tuning(提示词微调),NLP的四次变革 自然语言处理(NLP)技术从最早的手工特征设计到如今的Prompt-Tuning,经历了四个重要阶段。随着技术的不断发展,我们的目标…...
GAMES101:现代计算机图形学入门-笔记-09
久违的101图形学回归咯 今天的话题应该是比较轻松的:聊一聊在渲染中比较先进的topics Advanced Light Transport 首先是介绍一系列比较先进的光线传播方法,有无偏的如BDPT(双向路径追踪),MLT(梅特罗波利斯…...
【Db First】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
