En esta página

QOpcUaGenericStructHandler Class

Lee los tipos de datos de un servidor y decodifica/codifica structs genéricos de/a objetos de extensión. Más...

Cabecera: #include <QOpcUaGenericStructHandler>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmake: QT += opcua
Desde: Qt 6.7
Hereda: QObject

Tipos públicos

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

Funciones públicas

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

Señales

void initializedChanged(bool initialized)

Descripción detallada

La codificación de datos binarios utilizada en OPC UA se diseñó pensando en un tamaño de mensaje pequeño y no contiene ninguna información sobre la estructura de los datos. Esto significa que un descodificador debe conocer de antemano la estructura de los datos codificados para poder descodificar un búfer de datos.

Desde OPC UA 1.04, los nodos de la clase de nodo DataType pueden tener el atributo DataTypeDefinition que contiene información sobre los campos de los tipos estructurados y el mapeo de valores enum a nombres. Junto con el conocimiento sobre cómo descodificar tipos incorporados, esto permite a un cliente descodificar tipos estructurados personalizados genéricos sin depender de conocimientos externos.

QOpcUaGenericStructHandler recorre la jerarquía de tipos de un servidor siguiendo las referencias HasSubtype empezando por BaseDataType y lee el atributo DataTypeDefinition de los nodos.

Para los tipos estructurados en los que hay un valor QOpcUaStructureDefinition en el atributo DataTypeDefinition, está disponible la descodificación automática de los objetos de extensión que los contienen. Los campos con un tipo incorporado o un tipo en el que existe una clase de datos C++ se deserializan al tipo Qt OPC UA correspondiente, otros structs genéricos se serializan a un QOpcUaGenericStructValue anidado. Todos los valores struct genéricos anidados deben tener un QOpcUaStructureDefinition en el servidor o la descodificación falla.

Las mismas condiciones se aplican a la codificación de una estructura personalizada.

Ejemplo de descodificación de una estructura personalizada:

QOpcUaGenericStructHandler handler(opcuaClient); handler.initialize();QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) { if (!initialized) return; auto node =  opcuaClient->node("ns=4;i=3003"); // Un nodo de prueba de estructura personalizada en el open62541-testserver node->readValueAttribute();    QObject::connect(nodo, &QOpcUaNode::attributeRead, [node, &handler]( QOpcUa::NodeAttributes attr) { if (!attr.testFlag(QOpcUa::NodeAttribute::Value) ||  node->valueAttributeError() != QOpcUa::UaStatusCode::Good) return; auto extObj =  node->valueAttribute().value<QOpcUaExtensionObject>();        qDebug() << "Got object of type" << handler.typeNameForBinaryEncodingId(extObj.encodingTypeId());

       const auto result = handler.decode(extObj); if (!result) return;
        qDebug() << *result;
    }); });

Ejemplo de codificación de una estructura personalizada:

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...
});

Member Type Documentation

enum class QOpcUaGenericStructHandler::DataTypeKind

Este tipo enum especifica el tipo de datos de un nodo de tipo de datos.

ConstanteValorDescripción
QOpcUaGenericStructHandler::DataTypeKind::Unknown0El id del nodo de tipo es desconocido.
QOpcUaGenericStructHandler::DataTypeKind::Struct1El id del nodo de tipo pertenece a un tipo estructurado.
QOpcUaGenericStructHandler::DataTypeKind::Enum2El id del nodo de tipo pertenece a un tipo enum.
QOpcUaGenericStructHandler::DataTypeKind::Other3El id del nodo de tipo pertenece a un tipo que no es struct ni enum (otros tipos incorporados o sus subtipos).

Documentación de funciones miembro

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

Construye un manejador struct genérico para client.

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

Añade la definición de enum personalizada definition a los tipos conocidos. Puede utilizarse para soportar estructuras personalizadas para las que el servidor no expone una StructureDefinition. Los parámetros definition, typeId y name son necesarios para una decodificación y codificación adecuadas. Si isAbstract está establecido, el tipo no puede ser codificado y decodificado.

Devuelve true si la definición de enum se ha añadido correctamente.

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

Añade la definición de estructura personalizada definition a los tipos conocidos. Puede utilizarse para admitir estructuras personalizadas para las que el servidor no expone una StructureDefinition. Los parámetros definition, typeId y name son necesarios para una decodificación y codificación adecuadas. Si isAbstract está establecido, el tipo no puede ser codificado y decodificado.

Devuelve true si la definición de estructura se ha añadido correctamente.

QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)

Devuelve un valor struct genérico rellenado previamente con la definición struct, el id de tipo y el nombre de tipo correspondientes a typeId. Para todos los campos obligatorios, se insertará un marcador de posición no válido QVariant.

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

Devuelve la clase de tipo de datos para el id de nodo de tipo id.

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

Decodifica extensionObject a un QOpcUaGenericStructValue. Si el decodificador falla, se devuelve std::nullopt.

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

Devuelve value codificado como QOpcUaExtensionObject, o std::nullopt si no se ha podido codificar el valor.

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

Devuelve el QOpcUaEnumDefinition para el id de nodo de tipo id. Si el id de nodo es desconocido o no pertenece a un tipo enum, se devuelve un valor construido por defecto.

bool QOpcUaGenericStructHandler::initialize()

Inicia el recorrido por la jerarquía de tipos de datos. El éxito o el fracaso se notifican en la señal initializedChanged.

Devuelve false si la operación no puede iniciarse.

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

Devuelve true si el manejador de estructura genérica está inicializado.

Esta función se introdujo en Qt 6.7.

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

Esta señal se emite cuando el proceso de inicialización ha finalizado. initialized indica si la inicialización se ha realizado correctamente.

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

Devuelve true si el tipo de datos descrito por id es abstracto.

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

Devuelve el QOpcUaStructureDefinition para el id de nodo de codificación binaria id. Si el id de nodo es desconocido o no pertenece a un tipo struct, se devuelve un valor construido por defecto.

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

Devuelve el QOpcUaStructureDefinition para el id de nodo de tipo id. Si el id de nodo es desconocido o no pertenece a un tipo struct, se devuelve un valor construido por defecto.

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

Devuelve el id de nodo de tipo asociado al id de codificación binaria id.

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

Devuelve el nombre del tipo perteneciente al id de nodo de codificación binaria id. Si el id de nodo es desconocido o no pertenece a un tipo struct, se devuelve una cadena vacía.

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

Devuelve el nombre de tipo perteneciente a un nodo de tipo de datos identificado por el id de nodo de tipo id. Si se desconoce el id del nodo, se devuelve una cadena vacía.

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