【QT/C++】Qt开发环境安装配置与.pro文件项目配置指南详解(超详细)
- 本文主要详细说明Qt开发环境与安装配置的学习知识体系。
(关注不迷路哈!!!)
文章目录
1. Qt开发环境概述
1.1 Qt框架简介
Qt是一个跨平台的C++应用程序开发框架,提供丰富的工具和库,具有自己的事件处理机制,适用于开发GUI程序、网络应用、嵌入式应用等各类软件。
1.2 主要开发工具
- Qt Creator:官方集成开发环境,包含代码编辑器、可视化界面设计工具、调试器等
- Qt Designer:可视化界面设计工具,可快速创建和编辑Qt界面文件,并生成对应的 C++ 代码
- Qt Assistant:帮助文档浏览器,包含官方文档和示例代码,有助于快速查找和学习 Qt 的相关知识
2. Qt安装与配置
2.1 安装流程
QT相关链接,请参考:
l QT官方学习文档:Qt Documentation | Home
l Qt 官网下载页面:Download Qt OSS: Get Qt Online Installer
l 在线安装器下载地址:http://download.qt.io/archive/online_installers/
访问Qt官网下载在线安装器
当前使用Win10 系统进行开发的,故选择第二个点击下载。由于最新系列的 Qt6 系列不提供离线安装包,故采用线上安装的形式。

2. 注册并登录Qt账号
启动需要登录账号,若没有登录账号,则需要在 Qt 官网进行注册。

- 3. 选择安装选项(推荐Custom installation自定义安装)
接着,跟着一路操作到下面安装选项页面,在最近的在线安装包的安装过程中会有这四个安装选项,或者叫预安装选项。
- 【Custom Installation】:需要我们之后自己选择组件。
- 【Qt 6.x for desktop development】:这一项会安装一部分用于桌面开发的组件,通常已经够了,后期如果需要别的组件,也是可以随时添加的。
- 【Qt Design Studio】:是一个工具,支持可视化编程,这个工具一般都会安装,但往往不是单独安装,所以通常也不会选择这一项。
- 【Qt 6.x for mobile development】:选择后会安装一部分用于移动开发的组件,对于开发移动应用,选择这一项应该也是足够的。

- 4. 根据开发需求选择组件
如果在安装选项这一步选择了【Qt 6.x for desktop development】,那么就意味着,我们想要自己选择组件。于是,接着就到了组件选择页面。
- Qt 提供了丰富的组件,不同的组件适应不同的开发需求,所以我们需要认识并挑出我们需要的组件。

Qt 框架核心组件包括:
WebAssembly 允许在 Web 上运行 Qt 应用程序,即可以将 Qt 应用程序编译成 WebAssembly 格式,使得你可以在网页中运行 Qt 应用程序。
MSVC 2022 ARM64、LLVM-MinGW 17.0.6 64-bit、MSVC 2022 64-bit、MinGW 13.1.0 64-bit 这四个组件分别涉及三种编译工具链:MSVC、LLCM-MinGW、MinGW 相应工具链版本的 Qt 库。
Android 表示 Android 平台支持;Sources 表示 Qt 源代码;Additional Libraries 打开还有更多与图形配置等相关的组件,这里不展开说明。
5. 完成安装并启动Qt Creator
选择合适且需要的勾选然后安装即可,不确定的就不勾选等用到再补,接着等待安装成功,下图是QT安装完成之后打开的显示页面。

2.2 核心组件选择
- 编译工具链:MSVC、MinGW等版本
- 平台支持:WebAssembly、Android等
- 开发模块:Core、GUI、Widgets等基础模块
3. Qt项目配置(.pro文件)
3.1 基础模块配置
QT += core gui serialport serialbus sql printsupport core5compat network
各模块功能说明:
- core:Qt核心功能模块,提供事件循环、容器类、元对象系统等基础服务。
- gui:图形界面基础模块,支持窗口系统集成、绘图、字体管理等。
- serialport:串口通信模块,用于激光设备控制指令的串口传输。
- serialbus:总线通信模块(如CAN总线),扩展多设备协同控制能力。
- sql:数据库操作支持,用于存储激光参数配置及调试日志。
- printsupport:打印服务模块,支持打印激光加工路径图。
- core5compat:Qt5核心兼容模块,确保跨Qt版本代码兼容性。
- network:网络通信模块,支持TCP/UDP协议,用于多机协同控制。
3.2 Widgets模块条件加载
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- 在Qt 5及以上版本中,widgets模块从gui模块分离,需单独声明以使用传统控件(如QPushButton、QMainWindow)。
- 若未声明,编译时会出现QWidget等类未定义的错误。
3.3 编译配置
CONFIG += c++17 lupdate lrelease
QMAKE_LRELEASE_FLAGS += -silent
- c++17:启用C++17标准,支持结构化绑定、std::optional等现代语法特性。
- lupdate:自动生成翻译源文件(.ts),用于多语言界面支持。
- lrelease:编译翻译文件为二进制格式(.qm),优化运行时加载效率。
- -silent:抑制lrelease的冗余输出信息,保持编译日志简洁。
3.4 输出路径配置
DESTDIR = C:/Exe_app
TARGET = "Exe_app"
TEMPLATE = app
- DESTDIR:指定编译输出目录为C:\Exe_app,便于统一管理可执行文件及依赖库
- TARGET:定义生成的可执行文件名称,用户双击即可启动激光控制软件。
- TEMPLATE = app:声明项目类型为应用程序,生成.exe文件(Windows)。
3.5 兼容性配置
DEFINES += QT_DEPRECATED_WARNINGS
INCLUDEPATH += Common Exe_app
- 启用Qt弃用API的编译警告(如QDesktopWidget相关接口),强制开发者更新代码以适配新版本Qt,避免因使用过时接口导致的运行时崩溃或功能异常。
- 将Common和Exe_app目录添加到编译器的头文件搜索路径,确保#include指令能正确解析模块化代码。
3.6 第三方库链接
exists(D:/Qt/Tools/) {
LIBS += D:/Qt/Tools/mingw1120_64/x86_64-w64-mingw32/lib/libwlanapi.a
} else {
LIBS += D:/Qt6/Tools/mingw1120_64/x86_64-w64-mingw32/lib/libwlanapi.a
}
- 根据Qt安装路径差异,动态链接Windows WIFI控制库libwlanapi.a。
- 适配Qt5/Qt6不同安装目录结构。避免因路径硬编码导致的编译失败。
3.7 资源与国际化
RESOURCES += Exe_app.qrc
TRANSLATIONS += Languages/lang_zh_CN.ts Languages/lang_en.ts
- 嵌入应用程序资源(图标、配置文件、界面元素),通过:/前缀访问
- 定义多语言翻译文件,支持动态语言切换。使用lupdate生成.ts翻译源文件,并通过Qt Linguist完成.qm二进制翻译文件编译
- 运行时通过QTranslator加载对应语言文件
4. 综合示例:简易计算器应用
4.1 项目结构
Calculator/
├── calculator.pro
├── main.cpp
├── calculator.h
├── calculator.cpp
└── calculator.ui
4.2 项目配置文件(calculator.pro)
QT += core gui widgets
CONFIG += c++17
TARGET = Calculator
TEMPLATE = app
SOURCES += main.cpp calculator.cpp
HEADERS += calculator.h
FORMS += calculator.ui
4.3 头文件(calculator.h)
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
class Calculator : public QWidget
{
Q_OBJECT
public:
Calculator(QWidget *parent = nullptr);
private slots:
void digitClicked();
void operatorClicked();
void equalClicked();
void clear();
private:
void setupUI();
double calculate(double leftOperand, const QString &pendingOperator, double rightOperand);
QLineEdit *display;
QString pendingAdditiveOperator;
QString pendingMultiplicativeOperator;
double sumInMemory;
double sumSoFar;
double factorSoFar;
bool waitingForOperand;
};
#endif // CALCULATOR_H
4.4 实现文件(calculator.cpp)
#include "calculator.h"
#include <QApplication>
#include <QPushButton>
#include <QSignalMapper>
Calculator::Calculator(QWidget *parent)
: QWidget(parent)
, sumInMemory(0.0)
, sumSoFar(0.0)
, factorSoFar(0.0)
, waitingForOperand(true)
{
setupUI();
}
void Calculator::setupUI()
{
display = new QLineEdit("0");
display->setReadOnly(true);
display->setAlignment(Qt::AlignRight);
display->setMaxLength(14);
QSignalMapper *signalMapper = new QSignalMapper(this);
QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(display, 0, 0, 1, 4);
// 创建数字按钮
for (int i = 0; i < 10; ++i) {
QPushButton *button = new QPushButton(QString::number(i));
connect(button, &QPushButton::clicked, signalMapper,
static_cast<void(QSignalMapper::*)()>(&QSignalMapper::map));
signalMapper->setMapping(button, QString::number(i));
// 布局代码省略...
}
// 创建操作符按钮
QPushButton *plusButton = new QPushButton("+");
QPushButton *minusButton = new QPushButton("-");
QPushButton *equalButton = new QPushButton("=");
QPushButton *clearButton = new QPushButton("C");
// 连接信号与槽
connect(signalMapper, static_cast<void(QSignalMapper::*)(const QString &)>(&QSignalMapper::mappedString),
this, &Calculator::digitClicked);
connect(plusButton, &QPushButton::clicked, this, &Calculator::operatorClicked);
connect(minusButton, &QPushButton::clicked, this, &Calculator::operatorClicked);
connect(equalButton, &QPushButton::clicked, this, &Calculator::equalClicked);
connect(clearButton, &QPushButton::clicked, this, &Calculator::clear);
setLayout(mainLayout);
setWindowTitle("Calculator");
}
void Calculator::digitClicked()
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
QString digitValue = clickedButton->text();
if (display->text() == "0" && digitValue == "0")
return;
if (waitingForOperand) {
display->clear();
waitingForOperand = false;
}
display->setText(display->text() + digitValue);
}
void Calculator::operatorClicked()
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
QString clickedOperator = clickedButton->text();
double operand = display->text().toDouble();
if (!pendingMultiplicativeOperator.isEmpty()) {
// 处理乘除运算
} else {
sumSoFar += operand;
}
pendingAdditiveOperator = clickedOperator;
waitingForOperand = true;
}
void Calculator::equalClicked()
{
double operand = display->text().toDouble();
if (!pendingMultiplicativeOperator.isEmpty()) {
// 处理乘除运算
} else {
sumSoFar += operand;
}
display->setText(QString::number(sumSoFar));
sumSoFar = 0.0;
pendingAdditiveOperator.clear();
waitingForOperand = true;
}
void Calculator::clear()
{
sumInMemory = 0.0;
sumSoFar = 0.0;
factorSoFar = 0.0;
pendingAdditiveOperator.clear();
pendingMultiplicativeOperator.clear();
display->setText("0");
waitingForOperand = true;
}
double Calculator::calculate(double leftOperand, const QString &pendingOperator, double rightOperand)
{
if (pendingOperator == "+") {
return leftOperand + rightOperand;
} else if (pendingOperator == "-") {
return leftOperand - rightOperand;
} else if (pendingOperator == "×") {
return leftOperand * rightOperand;
} else if (pendingOperator == "÷") {
if (rightOperand == 0.0)
return 0.0;
return leftOperand / rightOperand;
}
return 0.0;
}
4.5 主函数(main.cpp)
#include <QApplication>
#include "calculator.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Calculator calculator;
calculator.show();
return app.exec();
}
通过以上综合示例,可以更好地理解Qt开发环境的配置应用,为实际项目开发奠定坚实基础。
浙公网安备 33010602011771号