Qt Protobuf
Qt Protobuf 生成器插件可从.proto 文件生成基于Qt的类。您可以使用这些类对关联的protobuf消息进行序列化和反序列化。
概述
什么是协议缓冲区?
协议缓冲区(Protocol Buffers)是一种语言中立、平台中立且可扩展的结构化数据序列化机制,它既紧凑又易于使用:
- 用户在
.proto文件中定义数据结构。 - 在构建时,Proto 编译器会对
.proto文件进行处理,生成多种编程语言的代码。
生成的格式适用于网络传输或长期数据存储。
协议缓冲区解决了哪些问题?
协议缓冲区为大小不超过几兆字节的类型化且结构化的数据包提供了一种序列化格式。它允许在添加新信息时,既不使现有数据失效,也不需要更新代码。有关更多信息,请参阅《协议缓冲区概述》。
使用优势Qt Protobuf
您可以在任何基于 Qt 的项目中使用 Protocol Buffers 机制:
- 无需显式调用 Protocol Buffers 编译器。
- 无需手动将生成的代码集成到项目树中。
- 可直接访问序列化和反序列化 API。
- 为生成的 Protobuf 消息提供集成的属性机制。
- 如需集成 gRPC 客户端支持,请参阅Qt GRPC 模块。
- 有关对生成的 Protobuf 消息的集成QML 类型支持。
- 若要启用 Qt Core 和 Qt GUI 类型作为 *.proto 模式的一部分。
使用该模块
Google协议缓冲区提供了一个名为protoc 的生成器,该生成器支持扩展。qtprotobufgen工具是protoc 的一个扩展,需要您在主机系统上安装protoc 。有关安装的更多信息,请参阅Protoc安装。
- 以下是使用apt 在 Linux 上进行安装的示例:
apt install -y protobuf-compiler protoc --version # Ensure compiler version is 3+ - 使用 vcpkg 在 Windows 上安装的示例
QML API
该模块的 QML 类型可通过qt_add_protobuf()宏中的 QML 和 QML_URI 选项获取。 导入名称与.proto 包名相同,或由qt_add_protobuf()宏中的QML_URI选项定义。要使用这些类型,请在您的.qml文件中添加以下导入语句:
import my.proto.package.uriC++ API
要使用 Qt 模块的 C++ API,需要将模块库链接到项目中,既可以直接链接,也可以通过其他依赖项间接链接。包括CMake和qmake 在内的多种构建工具都提供了对此功能的专门支持。
使用 CMake 构建
使用find_package() 命令在Qt6 包中定位所需的模块组件:
find_package(Qt6 REQUIRED COMPONENTS Protobuf)
target_link_libraries(mytarget PRIVATE Qt6::Protobuf)更多详细信息,请参阅“使用 CMake 构建”概述。
文章与指南
- Qt6 Protobuf 中的 CMake 命令
- Protobuf Qt Core Types
- Protobuf Qt GUI Types
- Qt Protobuf Well-Known types
- Qt Protobuf 可变的获取器
参考资料
示例
许可与归属
Qt Protobuf 模块由The Qt Company提供,采用商业许可。此外,该模块还提供以下自由软件许可:GNU较宽松通用公共许可证第3版、 GNU通用公共许可证第2版或GNU通用公共许可证第3版。更多详情请参阅Qt许可条款。
此外,Qt 6.12.0 中的qtprotobufgen 工具可能包含遵循以下宽松许可协议的第三方模块:
BSD 3 条款“新”或“修订”许可 |
© 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.