先决条件

一、设置 vcpkg

1.1 克隆存储库

第一步是从 GitHub 克隆 vcpkg 存储库。 存储库包含用于获取 vcpkg 可执行文件的脚本,以及由 vcpkg 社区维护的特选开放源代码库的注册表。 要执行此操作,请运行:

1
git clone https://github.com/microsoft/vcpkg.git

vcpkg 特选注册表是一组数量超过 2000 个的开源库。 这些库已通过 vcpkg 的持续集成管道进行验证,可以协同工作。 虽然 vcpkg 存储库不包含这些库的源代码,但它保存方案和元数据,以便在系统中生成和安装它们。

1.2 运行启动脚本

现在,你已经克隆了 vcpkg 存储库,请导航到 vcpkg 目录并执行启动脚本:

1
2
cd vcpkg; 
.\bootstrap-vcpkg.bat

启动脚本执行先决条件检查并下载 vcpkg 可执行文件。

就这么简单! vcpkg 已安装并可供使用。

1.3 在 vcpkg 安装 Qt5 库

1
vcpkg install qt5-base:x64-windows

1.4 设置环境变量

二、安装 Visual Studio Code 扩展

导航到“扩展”视图并安装 C++ 扩展。 此操作将启用 C++ IntelliSense 和代码导航。

安装 CMake 工具扩展。 这将在 Visual Studio Code 中启用 CMake 支持。

三、创建项目

3.1 创建项目文件夹

首先,在一个新目录中创建项目文件夹,例如 MyQtApp。

1
2
mkdir MyQtApp
cd MyQtApp

3.2 生成清单文件并添加依赖项

非必须,但使用 vcpkg.json 可以自动管理依赖项,编译时如果库不存在,会自动用 vcpkg 安装。

运行以下命令,在 helloworld 文件夹的根目录中创建 vcpkg 清单文件 (vcpkg.json):

1
vcpkg new --application

vcpkg new 命令在项目的目录中添加一个 vcpkg.json 文件和一个 vcpkg-configuration.json 文件。

添加 fmt 和 qt5-base 包作为依赖项:

1
2
vcpkg add port fmt
vcpkg add port qt5-base

vcpkg.json 中加上版本信息,如下:

1
2
3
4
5
6
7
8
9
{
    "name": "myqtapp",
    "version-string": "0.1.0",
    "dependencies": [
      "qt5-base",
      "poco",
      "fmt"
    ]
}

生成的 vcpkg-configuration.json 文件引入了一个基线,用于对项目的依赖项设置最低版本约束。 修改此文件超出了本教程的范围。 虽然在本教程中不适用,但建议将 vcpkg-configuration.json 文件保留在源代码管理之下,以确保不同开发环境中的版本一致性。

3.3 创建 CMake 配置文件

在你的项目根目录下创建 CMakeLists.txt 文件,用于配置 CMake 构建系统。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.14)

project(MyQtApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 设置 Qt MOC(Meta-Object Compiler)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_executable(MyQtApp 
    WIN32
    main.cpp mainwindow.cpp)

target_link_libraries(MyQtApp PRIVATE Qt5::Widgets)

3.4 编写 UI 和源代码

你需要一个 UI 和对应的 C++ 文件。首先编写一个简单的主窗口 UI。

mainwindow.ui

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <widget class="QWidget" name="centralwidget"/>
  <widget class="QMenuBar" name="menubar"/>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

mainwindow.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};

#endif // MAINWINDOW_H

mainwindow.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // 设置 UI
    resize(400, 300);
}

MainWindow::~MainWindow()
{
}

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow window;
    window.show();

    return app.exec();
}

3.5 用 CMakePresets.json 定义构建设置

在项目根目录中创建 CMakePresets.json,用于管理 CMake 预设,包括 vcpkg 集成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
    "version": 3,
    "cmakeMinimumRequired": {
      "major": 3,
      "minor": 19,
      "patch": 0
    },
    "configurePresets": [
      {
        "name": "msvc",
        "hidden": false,
        "generator": "Visual Studio 16 2019",
        "binaryDir": "${sourceDir}/build",
        "toolset": "host=x64",
        "architecture": "x64",
        "cacheVariables": {
          "CMAKE_TOOLCHAIN_FILE": "D:/Development/vcpkg/scripts/buildsystems/vcpkg.cmake"
        },
        "environment": {
        }
      }
    ],
    "buildPresets": [
      {
        "name": "msvc-debug",
        "configurePreset": "msvc", 
        "configuration": "Debug"   
      },
      {
        "name": "msvc-release",
        "configurePreset": "msvc",
        "configuration": "Release"    
      }
    ]
  }

在项目根目录中创建 CMakeUserPresets.json 文件(可选),格式和CMakePresets.json一样,可以继承。一般CMakePresets.json用于通用配置,CMakeUserPresets.json用于特殊配置。

可配置的presets有:

  • configurePresets:用于cmake –preset configurePreset_name
  • buildPresets:用于cmake –build –preset buildPreset_name命令
  • testPresets: 用于ctest –preset testPresets_name
  • packagePresets:用于cpack –preset packagePresets_name
  • workflowPresets:用于一键式运行cmake –workflow –preset workflowPresets_name (VSCode 目前不支持)

3.6 生成和运行项目

打开 VSCode,按 F1,按下面顺序操作:

1
2
3
4
CMake:Select Configure Preset //选择 ``msvc``
Cmake:Configure
Cmake:Select Build Preset //选择 ``msvc-debug``  ``msvc-release``
CMake:Build