QDBusArgument Class
La clase QDBusArgument se utiliza para marshall y demarshall argumentos D-Bus. Más...
| Cabecera: | #include <QDBusArgument> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS DBus)target_link_libraries(mytarget PRIVATE Qt6::DBus) |
| qmake: | QT += dbus |
Tipos Públicos
| enum | ElementType { BasicType, VariantType, ArrayType, StructureType, MapType, …, UnknownType } |
Funciones públicas
| QDBusArgument() | |
| QDBusArgument(const QDBusArgument &other) | |
| ~QDBusArgument() | |
| QVariant | asVariant() const |
| bool | atEnd() const |
| void | beginArray() const |
| void | beginArray(QMetaType id) |
| void | beginMap() const |
| void | beginMap(QMetaType keyMetaType, QMetaType valueMetaType) |
| void | beginMapEntry() |
| void | beginMapEntry() const |
| void | beginStructure() |
| void | beginStructure() const |
| QDBusArgument::ElementType | currentType() const |
| void | endArray() |
| void | endArray() const |
| void | endMap() |
| void | endMap() const |
| void | endMapEntry() |
| void | endMapEntry() const |
| void | endStructure() |
| void | endStructure() const |
| void | swap(QDBusArgument &other) |
| QDBusArgument & | operator<<(uchar arg) |
| QDBusArgument & | operator<<(bool arg) |
| QDBusArgument & | operator<<(const QByteArray &arg) |
| QDBusArgument & | operator<<(const QDBusVariant &arg) |
| QDBusArgument & | operator<<(const QString &arg) |
| QDBusArgument & | operator<<(const QStringList &arg) |
| QDBusArgument & | operator<<(double arg) |
| QDBusArgument & | operator<<(int arg) |
| QDBusArgument & | operator<<(qlonglong arg) |
| QDBusArgument & | operator<<(qulonglong arg) |
| QDBusArgument & | operator<<(short arg) |
| QDBusArgument & | operator<<(uint arg) |
| QDBusArgument & | operator<<(ushort arg) |
| QDBusArgument & | operator=(const QDBusArgument &other) |
| const QDBusArgument & | operator>>(uchar &arg) const |
| const QDBusArgument & | operator>>(QByteArray &arg) const |
| const QDBusArgument & | operator>>(QDBusVariant &arg) const |
| const QDBusArgument & | operator>>(QString &arg) const |
| const QDBusArgument & | operator>>(QStringList &arg) const |
| const QDBusArgument & | operator>>(bool &arg) const |
| const QDBusArgument & | operator>>(double &arg) const |
| const QDBusArgument & | operator>>(int &arg) const |
| const QDBusArgument & | operator>>(qlonglong &arg) const |
| const QDBusArgument & | operator>>(qulonglong &arg) const |
| const QDBusArgument & | operator>>(short &arg) const |
| const QDBusArgument & | operator>>(uint &arg) const |
| const QDBusArgument & | operator>>(ushort &arg) const |
No miembros relacionados
| QMetaType | qDBusRegisterMetaType() |
| T | qdbus_cast(const QDBusArgument &arg) |
Descripción detallada
Esta clase se utiliza para enviar argumentos a través de D-Bus a aplicaciones remotas y para recibirlos de vuelta. D-Bus ofrece un sistema de tipos extensible, basado en unos pocos tipos primitivos y asociaciones de ellos. Ver la página Qt D-Bus Type System para más información sobre el sistema de tipos.
QDBusArgument es la clase central en el sistema de tipos Qt D-Bus, proporcionando funciones para marshall y demarshall los tipos primitivos. Los tipos compuestos se crean entonces por asociación de uno o más de los tipos primitivos en arrays, diccionarios o estructuras.
El siguiente ejemplo ilustra cómo puede construirse una estructura que contenga un entero y una cadena utilizando el sistema de tiposQt D-Bus:
struct MyStructure { int count; QString name; // ... }; Q_DECLARE_METATYPE(MyStructure) // Marshall the MyStructure data into a D-Bus argument QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct) { argument.beginStructure(); argument << myStruct.count << myStruct.name; argument.endStructure(); return argument; } // Retrieve the MyStructure data from the D-Bus argument const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct) { argument.beginStructure(); argument >> myStruct.count >> myStruct.name; argument.endStructure(); return argument; }
El tipo tiene que ser registrado con qDBusRegisterMetaType() antes de que pueda ser utilizado con QDBusArgument. Por lo tanto, en algún lugar de tu programa, debes añadir el siguiente código:
qDBusRegisterMetaType<MyStructure>();
Una vez registrado, un tipo puede ser utilizado en llamadas a métodos salientes (colocados con QDBusAbstractInterface::call()), emisiones de señales desde objetos registrados o en llamadas entrantes desde aplicaciones remotas.
Es importante tener en cuenta que las funciones de flujo operator<< y operator>> deben producir siempre el mismo número de entradas en el caso de estructuras, tanto en lectura como en escritura (marshalling y demarshalling), de lo contrario las llamadas y señales pueden empezar a fallar silenciosamente.
El siguiente ejemplo ilustra este uso incorrecto en el contexto de una clase que puede contener datos no válidos:
//bad code // Wrongly marshall the MyTime data into a D-Bus argument QDBusArgument &operator<<(QDBusArgument &argument, const MyTime &mytime) { argument.beginStructure(); if (mytime.isValid) argument << true << mytime.hour << mytime.minute << mytime.second; else argument << false; argument.endStructure(); return argument; }
En este ejemplo, tanto la función operator<< como la operator>> pueden producir un número diferente de lecturas/escrituras. Esto puede confundir al sistema de tipos Qt D-Bus y debería evitarse.
Ver también QDBusAbstractInterface, El sistema de tipos Qt D-Bus , Uso de adaptadores, y qdbus_cast().
Documentación de tipos miembros
enum QDBusArgument::ElementType
Este enum describe el tipo de elemento que contiene el argumento.
| Constante | Valor | Descripción |
|---|---|---|
QDBusArgument::BasicType | 0 | Un elemento básico, que es entendido por QVariant. Los siguientes tipos se consideran básicos: bool, byte, short, ushort, int, uint, qint64, quint64, double, QString, QByteArray, QDBusObjectPath, QDBusSignature |
QDBusArgument::VariantType | 1 | El elemento variante (QDBusVariant) |
QDBusArgument::ArrayType | 2 | Un elemento de matriz, normalmente representado por QList<T>. Nota: QByteArray y los mapas asociativos no se consideran arrays, aunque el protocolo D-Bus los transporte como tales. |
QDBusArgument::StructureType | 3 | Un tipo personalizado representado por una estructura, como QDateTime, QPoint, etc. |
QDBusArgument::MapType | 4 | Un contenedor asociativo, como QMap<Key, Value> o QHash<Key, Value>. |
QDBusArgument::MapEntryType | 5 | Una entrada en un contenedor asociativo: tanto la clave como el valor forman un tipo de entrada de mapa. |
QDBusArgument::UnknownType | -1 | El tipo es desconocido o hemos llegado al final de la lista. |
Véase también currentType().
Documentación de las funciones miembro
QDBusArgument::QDBusArgument()
Construye un argumento QDBusArgument vacío.
Un objeto QDBusArgument vacío no permite ni la lectura ni la escritura.
QDBusArgument::QDBusArgument(const QDBusArgument &other)
Construye una copia del objeto other QDBusArgument.
Ambos objetos contendrán, por tanto, el mismo estado a partir de este momento. Los QDBusArguments son explícitamente compartidos y, por tanto, cualquier modificación en cualquiera de las copias afectará también a la otra.
[noexcept] QDBusArgument::~QDBusArgument()
Elimina los recursos asociados a este objeto QDBusArgument.
QVariant QDBusArgument::asVariant() const
Devuelve el argumento actual en forma de QVariant. Los tipos básicos serán decodificados y devueltos en QVariant, pero para tipos complejos, esta función devolverá un objeto QDBusArgument en QVariant. Es responsabilidad de quien llama decodificar el argumento (por ejemplo, llamando a asVariant() en él).
Por ejemplo, si el argumento actual es un INT32, esta función devolverá un QVariant con un argumento de tipo QMetaType::Int. Para una matriz de INT32, devolverá un QVariant que contiene un QDBusArgument.
Si se produce un error o si no hay más argumentos que decodificar (es decir, estamos al final de la lista de argumentos), esta función devolverá un QVariant no válido.
Véase también atEnd().
bool QDBusArgument::atEnd() const
Devuelve true si no hay más elementos que extraer de este QDBusArgument. Esta función suele utilizarse en los objetos QDBusArgument devueltos por beginMap() y beginArray().
void QDBusArgument::beginArray() const
Recurre a la matriz D-Bus para permitir la extracción de los elementos de la matriz.
Esta función se utiliza normalmente en operator>> operadores de flujo, como en el siguiente ejemplo:
// Extract a MyArray array of MyElement elements const QDBusArgument &operator>>(const QDBusArgument &argument, MyArray &myArray) { argument.beginArray(); myArray.clear(); while (!argument.atEnd()) { MyElement element; argument >> element; myArray.append(element); } argument.endArray(); return argument; }
Si el tipo que quieres demarshall es un QList o cualquiera de las Clases Contenedoras de Qt que toman un parámetro de plantilla, no necesitas declarar una función operator>> para ello, ya que Qt D-Bus proporciona plantillas genéricas para hacer el trabajo de demarshall de los datos. Lo mismo se aplica para los contenedores de secuencia de STL, como std::list, std::vector, etc.
Véase también atEnd(), beginStructure(), y beginMap().
void QDBusArgument::beginArray(QMetaType id)
Abre una nueva matriz D-Bus adecuada para añadir elementos del metatipo id.
Esta función se utiliza normalmente en operadores de flujo operator<<, como en el siguiente ejemplo:
// Append an array of MyElement types QDBusArgument &operator<<(QDBusArgument &argument, const MyArray &myArray) { argument.beginArray(qMetaTypeId<MyElement>()); for (const auto &element : myArray) argument << element; argument.endArray(); return argument; }
Si el tipo que quieres marshall es un QList o cualquiera de las Clases Contenedoras de Qt que toman un parámetro de plantilla, no necesitas declarar una función operator<< para ello, ya que Qt D-Bus proporciona plantillas genéricas para hacer el trabajo de marshalling de los datos. Lo mismo se aplica para los contenedores de secuencia de STL, como std::list, std::vector, etc.
Véase también endArray(), beginStructure(), y beginMap().
void QDBusArgument::beginMap() const
Recurre al mapa D-Bus para permitir la extracción de los elementos del mapa.
Esta función se utiliza normalmente en operadores de flujo operator>>, como en el siguiente ejemplo:
// Extract a MyDictionary map that associates integers to MyElement items const QDBusArgument &operator>>(const QDBusArgument &argument, MyDictionary &myDict) { argument.beginMap(); myDict.clear(); while (!argument.atEnd()) { int key; MyElement value; argument.beginMapEntry(); argument >> key >> value; argument.endMapEntry(); myDict.insert(key, value); } argument.endMap(); return argument; }
Si el tipo que desea demarshall es un QMap o QHash, no necesita declarar una función operator>> para él, ya que Qt D-Bus proporciona plantillas genéricas para hacer el trabajo de demarshall de los datos.
Véase también endMap(), beginStructure(), beginArray(), y beginMapEntry().
void QDBusArgument::beginMap(QMetaType keyMetaType, QMetaType valueMetaType)
Abre un nuevo mapa D-Bus adecuado para añadir elementos. Los mapas son contenedores que asocian una entrada (la clave) a otra (el valor), como QMap o QHash de Qt. Los ids de los metatipos clave y valor del mapa deben pasarse en keyMetaType y valueMetaType respectivamente.
Esta función se utiliza normalmente en los operadores de streaming de operator<<, como en el siguiente ejemplo:
// Append a dictionary that associates ints to MyValue types QDBusArgument &operator<<(QDBusArgument &argument, const MyDictionary &myDict) { argument.beginMap(QMetaType::fromType<int>(), QMetaType::fromType<MyValue>()); MyDictionary::const_iterator i; for (i = myDict.cbegin(); i != myDict.cend(); ++i) { argument.beginMapEntry(); argument << i.key() << i.value(); argument.endMapEntry(); } argument.endMap(); return argument; }
Normalmente no es necesario proporcionar una función operator<< o operator>> para contenedores asociativos como QHash o std::map, ya que Qt D-Bus proporciona plantillas genéricas para hacer el trabajo de marshalling de los datos.
Véase también endMap(), beginStructure(), beginArray(), y beginMapEntry().
void QDBusArgument::beginMapEntry()
Abre una entrada de mapa D-Bus adecuada para añadir las entradas de clave y valor. Esta función sólo es válida cuando se ha abierto un mapa con beginMap().
Véase beginMap() para un ejemplo de utilización de esta función.
Véase también endMapEntry() y beginMap().
void QDBusArgument::beginMapEntry() const
Recurre a la entrada del mapa D-Bus para permitir la extracción del par clave y valor.
Véase beginMap() para un ejemplo de cómo se utiliza normalmente esta función.
Véase también endMapEntry() y beginMap().
void QDBusArgument::beginStructure()
Abre una nueva estructura D-Bus adecuada para añadir nuevos argumentos.
Esta función se utiliza normalmente en los operadores de flujo operator<<, como en el siguiente ejemplo:
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct) { argument.beginStructure(); argument << myStruct.member1 << myStruct.member2; argument.endStructure(); return argument; }
Las estructuras pueden contener otras estructuras, por lo que el siguiente código también es válido:
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &myStruct) { argument.beginStructure(); argument << myStruct.member1 << myStruct.member2; argument.beginStructure(); argument << myStruct.member3.subMember1 << myStruct.member3.subMember2; argument.endStructure(); argument << myStruct.member4; argument.endStructure(); return argument; }
Véase también endStructure(), beginArray(), y beginMap().
void QDBusArgument::beginStructure() const
Abre una estructura D-Bus apta para extraer elementos.
Esta función se utiliza normalmente en los operadores de flujo operator>>, como en el ejemplo siguiente:
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &myStruct) { argument.beginStructure(); argument >> myStruct.member1 >> myStruct.member2 >> myStruct.member3; argument.endStructure(); return argument; }
Véase también endStructure(), beginArray() y beginMap().
QDBusArgument::ElementType QDBusArgument::currentType() const
Devuelve la clasificación del tipo de elemento actual. Si se produce un error decodificando el tipo o si estamos al final del argumento, esta función devuelve QDBusArgument::UnknownType.
Esta función sólo tiene sentido cuando se demarshalling argumentos. Si se utiliza mientras se marshalling, siempre devolverá UnknownType.
void QDBusArgument::endArray()
Cierra un array D-Bus abierto con beginArray(). Esta función debe ser llamada el mismo número de veces que beginArray().
Véase también beginArray(), endStructure(), y endMap().
void QDBusArgument::endArray() const
Cierra el array D-Bus y permite extraer el siguiente elemento después del array.
Véase también beginArray().
void QDBusArgument::endMap()
Cierra un mapa D-Bus abierto con beginMap(). Esta función debe llamarse el mismo número de veces que beginMap().
Véase también beginMap(), endStructure(), y endArray().
void QDBusArgument::endMap() const
Cierra el mapa D-Bus y permite extraer el siguiente elemento después del mapa.
Véase también beginMap().
void QDBusArgument::endMapEntry()
Cierra una entrada de mapa D-Bus abierta con beginMapEntry(). Esta función debe llamarse el mismo número de veces que beginMapEntry().
Véase también beginMapEntry().
void QDBusArgument::endMapEntry() const
Cierra la entrada del mapa D-Bus y permite extraer el siguiente elemento del mapa.
Véase también beginMapEntry().
void QDBusArgument::endStructure()
Cierra una estructura D-Bus abierta con beginStructure(). Esta función debe llamarse el mismo número de veces que beginStructure().
Véase también beginStructure(), endArray() y endMap().
void QDBusArgument::endStructure() const
Cierra la estructura D-Bus y permite extraer el siguiente elemento después de la estructura.
Véase también beginStructure().
[noexcept] void QDBusArgument::swap(QDBusArgument &other)
Cambia este argumento por other. Esta operación es muy rápida y nunca falla.
QDBusArgument &QDBusArgument::operator<<(uchar arg)
Añade el valor primitivo arg de tipo BYTE al flujo D-Bus.
QDBusArgument &QDBusArgument::operator<<(bool arg)
Añade el valor primitivo arg de tipo BOOLEAN al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)
Añade el QByteArray dado por arg como ARRAY of BYTE al flujo D-Bus.
QStringList y QByteArray son los dos únicos tipos no primitivos soportados directamente por QDBusArgument debido a su extendido uso en aplicaciones Qt.
Otros arrays son soportados a través de tipos compuestos en Qt D-Bus.
Esta es una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)
Añade el valor primitivo arg de tipo VARIANT al flujo D-Bus.
Un tipo de variante D-Bus puede contener cualquier tipo, incluidas otras variantes. Es similar al tipo Qt QVariant.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(const QString &arg)
Añade el valor primitivo arg de tipo STRING (cadena de caracteres Unicode) al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(const QStringList &arg)
Añade el QStringList dado por arg como ARRAY of STRING al flujo D-Bus.
QStringList y QByteArray son los dos únicos tipos no primitivos soportados directamente por QDBusArgument debido a su extendido uso en aplicaciones Qt.
Otros arrays son soportados a través de tipos compuestos en Qt D-Bus.
Esta es una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(double arg)
Añade el valor primitivo arg de tipo DOUBLE (punto flotante de doble precisión) al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(int arg)
Añade el valor primitivo arg de tipo INT32 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(qlonglong arg)
Añade el valor primitivo arg de tipo INT64 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(qulonglong arg)
Añade el valor primitivo arg de tipo UINT64 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(short arg)
Añade el valor primitivo arg de tipo INT16 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(uint arg)
Añade el valor primitivo arg de tipo UINT32 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator<<(ushort arg)
Añade el valor primitivo arg de tipo UINT16 al flujo D-Bus.
Se trata de una función sobrecargada.
QDBusArgument &QDBusArgument::operator=(const QDBusArgument &other)
Copia el objeto other QDBusArgument en éste.
Por lo tanto, ambos objetos contendrán el mismo estado a partir de este momento. Los QDBusArguments se comparten explícitamente y, por tanto, cualquier modificación en cualquiera de las copias afectará también a la otra.
const QDBusArgument &QDBusArgument::operator>>(uchar &arg) const
Extrae un argumento primitivo D-Bus de tipo BYTE del flujo D-Bus y lo coloca en arg.
const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const
Extrae un array de bytes del flujo D-Bus y lo devuelve como QByteArray.
QStringList y QByteArray son los dos únicos tipos no primitivos soportados directamente por QDBusArgument debido a su extendido uso en aplicaciones Qt.
Otros arrays son soportados a través de tipos compuestos en Qt D-Bus.
Esta es una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(QDBusVariant &arg) const
Extrae un argumento primitivo D-Bus de tipo VARIANT del flujo D-Bus.
Un tipo de variante D-Bus puede contener cualquier tipo, incluidas otras variantes. Es similar al tipo Qt QVariant.
En caso de que la variante contenga un tipo no soportado directamente por QDBusArgument, el valor del QDBusVariant devuelto contendrá otro QDBusArgument. Es su responsabilidad demarshall aún más en otro tipo.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(QString &arg) const
Extrae un argumento primitivo D-Bus de tipo STRING (cadena de caracteres Unicode) del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(QStringList &arg) const
Extrae un array de cadenas del flujo D-Bus y lo devuelve como QStringList.
QStringList y QByteArray son los dos únicos tipos no primitivos soportados directamente por QDBusArgument debido a su extendido uso en aplicaciones Qt.
Otros arrays son soportados a través de tipos compuestos en Qt D-Bus.
Esta es una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(bool &arg) const
Extrae un argumento primitivo D-Bus de tipo BOOLEAN del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(double &arg) const
Extrae un argumento primitivo D-Bus de tipo DOUBLE (coma flotante de doble precisión) del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(int &arg) const
Extrae un argumento primitivo D-Bus de tipo INT32 del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(qlonglong &arg) const
Extrae un argumento primitivo D-Bus de tipo INT64 del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(qulonglong &arg) const
Extrae un argumento primitivo D-Bus de tipo UINT64 del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(short &arg) const
Extrae un argumento primitivo D-Bus de tipo INT16 del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(uint &arg) const
Extrae un argumento primitivo D-Bus de tipo UINT32 del flujo D-Bus.
Se trata de una función sobrecargada.
const QDBusArgument &QDBusArgument::operator>>(ushort &arg) const
Extrae un argumento primitivo D-Bus de tipo UINT16 del flujo D-Bus.
Se trata de una función sobrecargada.
No miembros relacionados
template <typename T> QMetaType qDBusRegisterMetaType()
Registra T en el sistema de tiposQt D-Bus y en Qt meta-type system, si no está ya registrado.
Para registrar un tipo, debe ser declarado como un meta-tipo con la macro Q_DECLARE_METATYPE(), y luego registrado como en el siguiente ejemplo:
#include <QDBusMetaType> qDBusRegisterMetaType<MyClass>();
Si T no es una de las clases contenedoras de Qt, los operadores de flujo operator<< y operator>> entre T y QDBusArgument deben estar ya declarados. Consulte la página Qt D-Bus Type System para obtener más información sobre cómo declarar dichos tipos.
Esta función devuelve el id del metatipo Qt para el tipo (el mismo valor que se devuelve desde qRegisterMetaType()).
Nota: La característica de que un T que hereda un tipo streamable (incluyendo los contenedores QList, QHash o QMap) puede ser streamed sin proporcionar operator<< y operator>> personalizados está obsoleta a partir de Qt 5.7, porque ignora todo en T excepto la clase base. No hay diagnóstico. Debería proporcionar siempre estos operadores para todos los tipos que desee transmitir y no confiar en los operadores de transmisión proporcionados por Qt para las clases base.
Nota: Esta función es thread-safe.
Ver también Qt D-Bus Type System, qRegisterMetaType(), y QMetaType.
template <typename T> T qdbus_cast(const QDBusArgument &arg)
Intenta demarshall el contenido de arg en el tipo T. Por ejemplo:
MyType item = qdbus_cast<Type>(argument);
Es equivalente a lo siguiente:
MyType item; argument >> item;
© 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.