Sur cette page

QOpcUaGenericStructHandler Class

Lit les types de données d'un serveur et décode/encode des structures génériques vers/depuis des objets d'extension. En savoir plus...

En-tête : #include <QOpcUaGenericStructHandler>
CMake : find_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmake : QT += opcua
Depuis : Qt 6.7
Hérite de : QObject

Types publics

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

Fonctions publiques

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

Signaux

void initializedChanged(bool initialized)

Description détaillée

Le codage binaire utilisé dans OPC UA a été conçu pour permettre d’obtenir des messages de petite taille et ne contient aucune information sur la structure des données. Cela signifie qu’un décodeur doit connaître à l’avance la structure des données codées pour pouvoir décoder un tampon de données.

Depuis la version 1.04 d’OPC UA, les nœuds de la classe de nœuds `DataType` peuvent disposer de l’attribut `DataTypeDefinition`, qui contient des informations sur les champs des types structurés et sur le mappage des valeurs d’énumération vers leurs noms. Associé à la connaissance des méthodes de décodage des types intégrés, cela permet à un client de décoder des types structurés génériques personnalisés sans avoir recours à des connaissances externes.

QOpcUaGenericStructHandler parcourt la hiérarchie des types d’un serveur en suivant les références HasSubtype à partir de BaseDataType et lit l’attribut DataTypeDefinition des nœuds.

Pour les types structurés dont l’attribut DataTypeDefinition contient une valeur « QOpcUaStructureDefinition », le décodage automatique des objets d’extension les contenant est disponible. Les champs de type intégré ou de type pour lequel une classe de données C++ existe sont désérialisés vers le type « Qt OPC UA » correspondant ; les autres structures génériques sont sérialisées vers un « QOpcUaGenericStructValue » imbriqué. Toutes les valeurs de structures génériques imbriquées doivent disposer d’un « QOpcUaStructureDefinition » sur le serveur, faute de quoi le décodage échoue.

Les mêmes conditions s’appliquent à l’encodage d’une structure personnalisée.

Exemple de décodage d’une structure personnalisée :

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 nœud de test de structure personnalisée dans le serveur 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;

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

Exemple d'encodage d'une structure personnalisée :

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

Documentation sur les types de membres

enum class QOpcUaGenericStructHandler::DataTypeKind

Ce type d'énumération spécifie le type de données d'un nœud de type de données.

ConstanteValeurDescription
QOpcUaGenericStructHandler::DataTypeKind::Unknown0L'identifiant du nœud de type est inconnu.
QOpcUaGenericStructHandler::DataTypeKind::Struct1L'identifiant du nœud de type appartient à un type structuré.
QOpcUaGenericStructHandler::DataTypeKind::Enum2L'identifiant du nœud de type appartient à un type énuméré.
QOpcUaGenericStructHandler::DataTypeKind::Other3L'identifiant du nœud de type appartient à un type qui n'est ni une structure ni une énumération (autres types intégrés ou leurs sous-types)

Documentation des fonctions membres

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

Crée un gestionnaire de structure générique pour client.

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

Ajoute la définition d’énumération personnalisée definition aux types connus. Cela permet de prendre en charge des structures personnalisées pour lesquelles le serveur n’expose pas de StructureDefinition. Les paramètres definition, typeId et name sont obligatoires pour garantir un décodage et un encodage corrects. Si isAbstract est défini, le type ne peut pas être encodé ni décodé.

Renvoie « true » si la définition de l'énumération a été ajoutée avec succès.

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

Ajoute la définition de structure personnalisée definition aux types connus. Cela permet de prendre en charge des structures personnalisées pour lesquelles le serveur ne fournit pas de StructureDefinition. Les paramètres definition, typeId et name sont obligatoires pour garantir un décodage et un encodage corrects. Si isAbstract est défini, le type ne peut être ni encodé ni décodé.

Renvoie ` true ` si la définition de structure a été ajoutée avec succès.

QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)

Renvoie une valeur de structure générique préremplie avec la définition de la structure, l'identifiant de type et le nom de type correspondant à typeId. Pour tous les champs obligatoires, un espace réservé invalide QVariant sera inséré.

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

Renvoie le type de données associé au nœud de type dont l'identifiant est id.

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

Convertit ` extensionObject ` en ` QOpcUaGenericStructValue`. En cas d'échec de la conversion, la méthode renvoie ` std::nullopt `.

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

Renvoie « value » encodé sous la forme « QOpcUaExtensionObject » ou « std::nullopt » si la valeur n'a pas pu être encodée.

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

Renvoie l'QOpcUaEnumDefinition correspondant à l'identifiant de nœud de type id. Si l'identifiant de nœud est inconnu ou n'appartient pas à un type énuméré, une valeur construite par défaut est renvoyée.

bool QOpcUaGenericStructHandler::initialize()

Lance la traversée de la hiérarchie des types de données. La réussite ou l'échec est signalé via le signal « initializedChanged ».

Renvoie « false » si l’opération ne peut pas être lancée.

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

Renvoie ` true ` si le gestionnaire de structure générique est initialisé.

Cette fonction a été introduite dans Qt 6.7.

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

Ce signal est émis lorsque le processus d’initialisation est terminé. La variable ` initialized ` indique si l’initialisation s’est déroulée avec succès.

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

Renvoie « true » si le type de données décrit par ` id ` est abstrait.

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

Renvoie l'QOpcUaStructureDefinition e correspondant à l'identifiant de nœud d'encodage binaire id. Si l'identifiant de nœud est inconnu ou n'appartient pas à un type struct, une valeur construite par défaut est renvoyée.

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

Renvoie l'QOpcUaStructureDefinition ion du type correspondant à l'identifiant de nœud id. Si l'identifiant de nœud est inconnu ou n'appartient pas à un type de structure, une valeur construite par défaut est renvoyée.

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

Renvoie l'identifiant du nœud de type associé à l'identifiant de codage binaire id.

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

Renvoie le nom du type correspondant à l'identifiant de nœud de codage binaire id. Si l'identifiant de nœud est inconnu ou n'appartient pas à un type struct, une chaîne vide est renvoyée.

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

Renvoie le nom du type associé à un nœud de type identifié par l'identifiant de nœud de type id. Si l'identifiant de nœud est inconnu, une chaîne vide est renvoyée.

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