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 系列 …...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...