【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开发环境的配置应用,为实际项目开发奠定坚实基础。