本页内容

QOpcUaGenericStructHandler Class

读取服务器的数据类型,并将通用结构体从扩展对象解码为通用结构体,或将其编码为扩展对象。更多内容...

头文件: #include <QOpcUaGenericStructHandler>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmake: QT += opcua
自: Qt 6.7
继承自: QObject

公共类型

enum class DataTypeKind { Unknown, Struct, Enum, Other }

公共函数

QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)
bool addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
bool addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
QOpcUaGenericStructValue createGenericStructValueForTypeId(const QString &typeId)
QOpcUaGenericStructHandler::DataTypeKind dataTypeKindForTypeId(const QString &id) const
std::optional<QOpcUaGenericStructValue> decode(const QOpcUaExtensionObject &extensionObject) const
std::optional<QOpcUaExtensionObject> encode(const QOpcUaGenericStructValue &value)
QOpcUaEnumDefinition enumDefinitionForTypeId(const QString &id) const
bool initialize()
(since 6.7) bool initialized() const
bool isAbstractTypeId(const QString &id) const
QOpcUaStructureDefinition structureDefinitionForBinaryEncodingId(const QString &id) const
QOpcUaStructureDefinition structureDefinitionForTypeId(const QString &id) const
QString typeIdForBinaryEncodingId(const QString &id) const
QString typeNameForBinaryEncodingId(const QString &id) const
QString typeNameForTypeId(const QString &id) const

信号

void initializedChanged(bool initialized)

详细说明

OPC UA 中使用的二进制数据编码旨在实现较小的消息大小,且不包含任何关于数据结构的信息。这意味着,解码器必须预先了解编码数据的结构,才能对数据缓冲区进行解码。

自 OPC UA 1.04 起,DataType 节点类的节点可以具有 DataTypeDefinition 属性,该属性包含结构化类型的字段信息以及枚举值与名称的映射关系。结合对内置类型解码方法的了解,这使得客户端能够解码通用的自定义结构化类型,而无需依赖外部知识。

QOpcUaGenericStructHandler 通过从 BaseDataType 开始追踪 HasSubtype 引用来遍历服务器的类型层次结构,并读取各节点的 DataTypeDefinition 属性。

对于在 DataTypeDefinition 属性中包含 `QOpcUaStructureDefinition ` 值的结构化类型,系统可自动反序列化包含这些值的扩展对象。 具有内置类型或存在 C++ 数据类的字段将被反序列化为相应的Qt OPC UA 类型,其他泛型结构体则被序列化为嵌套的QOpcUaGenericStructValue 。所有嵌套的泛型结构体值都必须在服务器中具有QOpcUaStructureDefinition ,否则解码将失败。

这些条件同样适用于自定义结构体的编码。

解码自定义结构体的示例:

QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();

QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](boolinitialized) {
    if(!initialized)
        return;

   autonode= opcuaClient->node("ns=4;i=3003");// open62541-testserver 中的自定义结构体测试节点
   node->readValueAttribute();

    QObject::connect(node, &QOpcUaNode::attributeRead, [node, &handler](QOpcUa::NodeAttributes attr) {
       if(!attr.testFlag(QOpcUa::NodeAttribute::Value)|| node->valueAttributeError()!= QOpcUa::UaStatusCode::Good)
            return;

        autoextObj= node->valueAttribute().value<QOpcUaExtensionObject>();
        qDebug() << "Got object of type" << handler.typeNameForBinaryEncodingId(extObj.encodingTypeId());

       const autoresult=handler.decode(extObj);

        if(!result)
            return;

        qDebug() << *result;
    });
});

自定义结构体的编码示例:

QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();

QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) {
    if (!initialized)
        return;

    QOpcUaGenericStructValue value = handler.createGenericStructValueForTypeId("ns=4;i=3006");
    value.fieldsRef()["MandatoryMember"] = 23.0;
    value.fieldsRef()["OptionalMember"] = 42.0;

    const auto ext = handler.encode(value);

    if (!ext)
        return;

    // Use the extension object to write a node's value attribute, in a method parameter, etc...
});

成员类型文档

enum class QOpcUaGenericStructHandler::DataTypeKind

此枚举类型指定了数据类型节点的数据类型类别。

常量值描述
QOpcUaGenericStructHandler::DataTypeKind::Unknown0类型节点 ID 不知名。
QOpcUaGenericStructHandler::DataTypeKind::Struct1该类型节点 ID 属于结构化类型。
QOpcUaGenericStructHandler::DataTypeKind::Enum2该类型节点 ID 属于枚举类型。
QOpcUaGenericStructHandler::DataTypeKind::Other3该类型节点 ID 属于既非结构体也非枚举的类型(其他内置类型或其子类型)

成员函数文档

[explicit] QOpcUaGenericStructHandler::QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)

为client 构建一个通用的结构体处理程序。

bool QOpcUaGenericStructHandler::addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)

将自定义枚举定义 `definition ` 添加到已知类型中。这可用于支持服务器未提供 `StructureDefinition` 的自定义结构。参数 `definition`、`typeId ` 和 `name ` 是正确进行解码和编码的必填项。如果设置了 `isAbstract `,则该类型无法进行编码和解码。

如果枚举定义添加成功,则返回true 。

bool QOpcUaGenericStructHandler::addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)

将自定义结构定义definition 添加到已知类型中。这可用于支持服务器未提供StructureDefinition的自定义结构。参数definition 、typeId 和name 是正确解码和编码所必需的。如果设置了isAbstract ,则该类型无法进行编码和解码。

如果结构定义已成功添加,则返回true 。

QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)

返回一个通用结构体值,其中已预先填充了与typeId 对应的结构体定义、类型标识符和类型名称。对于所有必填字段,将插入一个无效占位符QVariant 。

QOpcUaGenericStructHandler::DataTypeKind QOpcUaGenericStructHandler::dataTypeKindForTypeId(const QString &id) const

返回类型节点 ID 为id 的数据类型。

std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const

将extensionObject 解码为QOpcUaGenericStructValue 。如果解码失败,则返回std::nullopt 。

std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)

返回value ,该值以QOpcUaExtensionObject 格式编码;如果无法对该值进行编码,则返回std::nullopt 。

QOpcUaEnumDefinition QOpcUaGenericStructHandler::enumDefinitionForTypeId(const QString &id) const

返回类型节点 IDid 的QOpcUaEnumDefinition 。如果节点 ID 未知或不属于枚举类型,则返回默认构造的值。

bool QOpcUaGenericStructHandler::initialize()

开始遍历数据类型层次结构。成功或失败状态将通过initializedChanged 信号报告。

如果无法启动该操作,则返回false 。

[since 6.7] bool QOpcUaGenericStructHandler::initialized() const

如果通用结构体处理程序已初始化,则返回true 。

该函数在 Qt 6.7 中引入。

[signal] void QOpcUaGenericStructHandler::initializedChanged(bool initialized)

当初始化过程完成时,会发出此信号。initialized 表示初始化是否成功。

bool QOpcUaGenericStructHandler::isAbstractTypeId(const QString &id) const

如果由id 描述的数据类型是抽象类型,则返回true。

QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForBinaryEncodingId(const QString &id) const

返回二进制编码节点 IDid 的 `QOpcUaStructureDefinition `。如果节点 ID 未知或不属于结构体类型,则返回默认构造的值。

QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForTypeId(const QString &id) const

返回类型节点 IDid 对应的 `QOpcUaStructureDefinition `。如果节点 ID 未知或不属于结构体类型,则返回默认构造的值。

QString QOpcUaGenericStructHandler::typeIdForBinaryEncodingId(const QString &id) const

返回与二进制编码 IDid 关联的类型节点 ID。

QString QOpcUaGenericStructHandler::typeNameForBinaryEncodingId(const QString &id) const

返回属于二进制编码节点 IDid 的类型名称。如果节点 ID 未知或不属于结构体类型,则返回空字符串。

QString QOpcUaGenericStructHandler::typeNameForTypeId(const QString &id) const

返回由类型节点 IDid 标识的数据类型节点的类型名称。如果节点 ID 未知,则返回一个空字符串。

© 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.