本页内容

qtprotobufgen 工具

qtprotobufgen 工具可用于根据Protobuf模式生成Qt Protobuf 类。该工具由CMake的Qt6::ProtobufTools 软件包提供,它是Googleprotoc 工具的扩展。

find_package(Qt6 COMPONENTS ProtobufTools REQUIRED)

用法

Qt 提供了 CMake 函数,以便于使用qtprotobufgen 工具。当使用 CMake 作为构建工具时,建议优先使用Qt CMake API。对于 CMake 以外的构建系统,请参照“手动运行”部分中描述的命令进行调整。

注意:目前尚 不明确支持使用 gRPC™Qt GRPC 和 Protobuf 应用程序。

CMake

以下 CMake 命令可将 Protobuf 模式集成到 Qt 项目中。

qt_add_protobuf

使用 protobuf 模式生成基于 Qt 的 C++ 源代码。

通常会通过 CMake 并使用qt_add_protobuf 宏来调用qtprotobufgen 。

使用 qt_add_protobuf

cmake_minimum_required(VERSION 3.16...3.22)
project(MyThings)

find_package(Qt6 REQUIRED COMPONENTS Protobuf)
qt_standard_project_setup()

qt_add_protobuf(MyMessages
    GENERATE_PACKAGE_SUBFOLDERS
    PROTO_FILES
        path/to/message.proto
        path/to/other_message.proto
    PROTO_INCLUDES
        /path/to/proto/include
)

qt_add_executable(MyApp main.cpp)

target_link_libraries(MyApp PRIVATE MyMessages)

在上例中,我们生成一个名为MyMessages 的库,其中包含通过传递给PROTO_FILES 选项的路径所定义的消息类型。GENERATE_PACKAGE_SUBFOLDERS 选项用于为生成的文件生成文件夹结构。而PROTO_INCLUDES 选项则指示 protoc 在指定目录中查找依赖项或导入项。我们为一个名为MyApp 的可执行文件创建了一个目标,并将它与MyMessages 库进行链接。

手动运行

protoc --plugin=protoc-gen-qtprotobuf=<path/to/bin/>qtprotobufgen \
    --qtprotobuf_out="[<options>:]<output_dir>" \
    [--qtprotobuf_opt="<options>"] \
    [-I/extra/proto/include/path] \
    <protofile>.proto

options 参数是一个以分号分隔的Options列表。它可以通过两种不同的方式传递。 要么在 `output_dir` 参数的选项前添加,并用冒号分隔;要么通过一个单独的参数 `--qtprotobuf_opt` 传递。您还可以将相应的键作为环境变量 `QT_PROTOBUF_OPTIONS ` 传递。键必须以分号分隔的列表形式呈现:

export QT_PROTOBUF_OPTIONS="COPY_COMMENTS;GENERATE_PACKAGE_SUBFOLDERS"

选项

该生成器支持用于调整生成的选项。这些选项在qt_add_protobuf函数中具有直接别名。支持以下选项:

  • COPY_COMMENTS 将.proto 文件中的注释复制到生成的代码中。
  • GENERATE_PACKAGE_SUBFOLDERS 使用.proto 文件中的包名称指定符来创建生成的文件的文件夹结构。例如,如果包定义为:package io.qt.test ,则生成的文件将放置在OUTPUT_DIRECTORY/io/qt/test/ 中。
  • EXPORT_MACRO 定义生成代码中使用的导出宏的基名。最终的宏名称构建为QPB_<EXPORT_MACRO>_EXPORT 。如果未设置此选项,则不会生成导出宏。

    自 Qt 6.8 起,支持以下格式:EXPORT_MACRO=macro_name[:macro_output_file[:<true|false>]] 。此格式允许您指定包含导出宏的头文件名称,并显式控制是否生成该宏。

    注意:如果 未提供<macro_output_file>,该选项将默认采用之前的语法。

  • HEADER_GUARD 指定用于防止生成的头文件被多次包含的机制。可能的取值包括pragma 、filename 。默认值为filename 。将该选项设置为pragma 将生成现代的 pragma 头文件保护机制:
    #pragma once
    ...

    省略该选项或将其设置为filename 时,将生成ifdef 包裹式保护机制,并使用 '.proto' 文件名作为保护后缀:

    #ifdef MYMESSAGES_QPB_H
    #define MYMESSAGES_QPB_H
    ...
    #endif // MYMESSAGES_QPB_H

    请根据您的项目结构选择合适的保护符样式。

  • GENERATE_NON_FINAL_MESSAGES (自 Qt 6.11 起)会生成不带final 限定符的QtProtobuf 消息类。提供此选项是为了向后兼容。自 Qt 6.11 起,QtProtobuf 消息类默认会生成为final 。若要扩展生成的消息的行为,请优先使用组合而非继承。此选项将在 Qt 7 中移除。
  • GENERATE_NON_FINAL_PROPERTIES (自 Qt 6.12 起)会为未指定FINAL 修饰符的QtProtobuf 消息类生成属性。FINAL 修饰符可使QML工具应用性能优化并生成更高效的代码。自Qt 6.12起,QtProtobuf 消息属性默认会使用FINAL 修饰符进行生成。此选项仅为向后兼容而提供,并将在Qt 7中移除。有关FINAL 修饰符的更多信息,请参阅Qt属性系统。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.