前提条件

一、设置 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
20
21
22
23
24
25
26
27
28
29
cmake_minimum_required(VERSION 3.5)

project(QtApp VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

aux_source_directory(./src PROJECT_SOURCES)

add_executable(${PROJECT_NAME}
    ${PROJECT_SOURCES}
    )


target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)

set_target_properties(${PROJECT_NAME} PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

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
16
17
18
19
20
21
##ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

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
{
    "version": 3,
    "cmakeMinimumRequired": {
        "major": 3,
        "minor": 19,
        "patch": 0
    },
    "configurePresets": [
        {
            "name": "vs2019",
            "displayName": "Visual Studio Community 2019 Release - x86_amd64",
            "description": "Using compilers for Visual Studio 16 2019 (x86_x64 architecture)",
            "generator": "Visual Studio 16 2019",
            "toolset": "host=x86",
            "architecture": "x64",
            "binaryDir": "${sourceDir}/out/build/${presetName}",
            "cacheVariables": {
                "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
                "CMAKE_C_COMPILER": "cl.exe",
                "CMAKE_CXX_COMPILER": "cl.exe",
                "CMAKE_TOOLCHAIN_FILE": "D:/Development/vcpkg/scripts/buildsystems/vcpkg.cmake"
            }
        }
    ],
    "buildPresets": [
        {
            "name": "vs2019-debug",
            "displayName": "Visual Studio Community 2019 Release - x86_amd64 - Debug",
            "configurePreset": "vs2019",
            "configuration": "Debug"
        }
    ]
}

在项目根目录中创建 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