QDBusArgument Class▲
-
Header: QDBusArgument
-
CMake:
find_package(Qt6 REQUIRED COMPONENTS Dbus)
target_link_libraries(mytarget PRIVATE Qt6::Dbus)
-
qmake: QT += dbus
Detailed Description▲
The class is used to send arguments over D-Bus to remote applications and to receive them back. D-Bus offers an extensible type system, based on a few primitive types and associations of them. See the Qt D-Bus Type System page for more information on the type system.
QDBusArgument is the central class in the Qt D-Bus type system, providing functions to marshall and demarshall the primitive types. The compound types are then created by association of one or more of the primitive types in arrays, dictionaries or structures.
The following example illustrates how a structure containing an integer and a string can be constructed using the Qt D-Bus type system:
struct
MyStructure
{
int
count;
QString name;
// ...
}
;
Q_DECLARE_METATYPE(MyStructure)
// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyStructure &
amp;myStruct)
{
argument.beginStructure();
argument &
lt;&
lt; myStruct.count &
lt;&
lt; myStruct.name;
argument.endStructure();
return
argument;
}
// Retrieve the MyStructure data from the D-Bus argument
const
QDBusArgument &
amp;operator
&
gt;&
gt;(const
QDBusArgument &
amp;argument, MyStructure &
amp;myStruct)
{
argument.beginStructure();
argument &
gt;&
gt; myStruct.count &
gt;&
gt; myStruct.name;
argument.endStructure();
return
argument;
}
The type has to be registered with qDBusRegisterMetaType() before it can be used with QDBusArgument. Therefore, somewhere in your program, you should add the following code:
qDBusRegisterMetaType&
lt;MyStructure&
gt;();
Once registered, a type can be used in outgoing method calls (placed with QDBusAbstractInterface::call()), signal emissions from registered objects or in incoming calls from remote applications.
It is important to note that the operator<< and operator>> streaming functions must always produce the same number of entries in case of structures, both in reading and in writing (marshalling and demarshalling), otherwise calls and signals may start to silently fail.
The following example illustrates this wrong usage in context of a class that may contain invalid data:
//bad code
// Wrongly marshall the MyTime data into a D-Bus argument
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyTime &
amp;mytime)
{
argument.beginStructure();
if
(mytime.isValid)
argument &
lt;&
lt; true
&
lt;&
lt; mytime.hour
&
lt;&
lt; mytime.minute &
lt;&
lt; mytime.second;
else
argument &
lt;&
lt; false
;
argument.endStructure();
return
argument;
}
In this example, both the operator<< and the operator>> functions may produce a different number of reads/writes. This can confuse the Qt D-Bus type system and should be avoided.
See Also▲
Member Type Documentation▲
enum QDBusArgument::ElementType▲
This enum describes the type of element held by the argument.
Constant |
Value |
Description |
---|---|---|
QDBusArgument::BasicType |
0 |
A basic element, which is understood by QVariant. The following types are considered basic: bool, byte, short, ushort, int, uint, qint64, quint64, double, QString, QByteArray, QDBusObjectPath, QDBusSignature |
QDBusArgument::VariantType |
1 |
The variant element (QDBusVariant) |
QDBusArgument::ArrayType |
2 |
An array element, usually represented by QList<T>. Note: QByteArray and associative maps are not considered arrays, even if the D-Bus protocol transports them as such. |
QDBusArgument::StructureType |
3 |
A custom type represented by a structure, like QDateTime, QPoint, etc. |
QDBusArgument::MapType |
4 |
An associative container, like QMap<Key, Value> or QHash<Key, Value> |
QDBusArgument::MapEntryType |
5 |
One entry in an associative container: both the key and the value form one map-entry type. |
QDBusArgument::UnknownType |
-1 |
The type is unknown or we have reached the end of the list. |
See Also▲
See also currentType()
Member Function Documentation▲
QDBusArgument::QDBusArgument()▲
Constructs an empty QDBusArgument argument.
An empty QDBusArgument object does not allow either reading or writing to be performed.
QDBusArgument::QDBusArgument(const QDBusArgument &other)▲
Constructs a copy of the other QDBusArgument object.
Both objects will therefore contain the same state from this point forward. QDBusArguments are explicitly shared and, therefore, any modification to either copy will affect the other one too.
QDBusArgument::~QDBusArgument()▲
Disposes of the resources associated with this QDBusArgument object.
QVariant QDBusArgument::asVariant() const▲
Returns the current argument in the form of a QVariant. Basic types will be decoded and returned in the QVariant, but for complex types, this function will return a QDBusArgument object in the QVariant. It is the caller's responsibility to decode the argument (for example, by calling asVariant() in it).
For example, if the current argument is an INT32, this function will return a QVariant with an argument of type QMetaType::Int. For an array of INT32, it will return a QVariant containing a QDBusArgument.
If an error occurs or if there are no more arguments to decode (i.e., we are at the end of the argument list), this function will return an invalid QVariant.
See Also▲
See also atEnd()
bool QDBusArgument::atEnd() const▲
Returns true if there are no more elements to be extracted from this QDBusArgument. This function is usually used in QDBusArgument objects returned from beginMap() and beginArray().
void QDBusArgument::beginArray(QMetaType id)▲
Opens a new D-Bus array suitable for appending elements of meta-type id.
This function is used usually in operator<< streaming operators, as in the following example:
// Append an array of MyElement types
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyArray &
amp;myArray)
{
argument.beginArray(qMetaTypeId&
lt;MyElement&
gt;());
for
(const
auto
&
amp;element : myArray)
argument &
lt;&
lt; element;
argument.endArray();
return
argument;
}
If the type you want to marshall is a QList or any of the Qt's Container Classes that take one template parameter, you need not declare an operator<< function for it, since Qt D-Bus provides generic templates to do the job of marshalling the data. The same applies for STL's sequence containers, such as std::list, std::vector, etc.
See Also▲
See also endArray(), beginStructure(), beginMap()
void QDBusArgument::beginArray() const▲
Recurses into the D-Bus array to allow extraction of the array elements.
This function is used usually in operator>> streaming operators, as in the following example:
// Extract a MyArray array of MyElement elements
const
QDBusArgument &
amp;operator
&
gt;&
gt;(const
QDBusArgument &
amp;argument, MyArray &
amp;myArray)
{
argument.beginArray();
myArray.clear();
while
(!
argument.atEnd()) {
MyElement element;
argument &
gt;&
gt; element;
myArray.append(element);
}
argument.endArray();
return
argument;
}
If the type you want to demarshall is a QList or any of the Qt's Container Classes that take one template parameter, you need not declare an operator>> function for it, since Qt D-Bus provides generic templates to do the job of demarshalling the data. The same applies for STL's sequence containers, such as std::list, std::vector, etc.
See Also▲
See also atEnd(), beginStructure(), beginMap()
void QDBusArgument::beginMap(QMetaType keyMetaType, QMetaType valueMetaType)▲
Opens a new D-Bus map suitable for appending elements. Maps are containers that associate one entry (the key) to another (the value), such as Qt's QMap or QHash. The ids of the map's key and value meta types must be passed in keyMetaType and valueMetaType respectively.
This function is used usually in operator<< streaming operators, as in the following example:
// Append a dictionary that associates ints to MyValue types
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyDictionary &
amp;myDict)
{
argument.beginMap(QMetaType::
fromType&
lt;int
&
gt;(), QMetaType::
fromType&
lt;MyValue&
gt;());
MyDictionary::
const_iterator i;
for
(i =
myDict.cbegin(); i !=
myDict.cend(); ++
i) {
argument.beginMapEntry();
argument &
lt;&
lt; i.key() &
lt;&
lt; i.value();
argument.endMapEntry();
}
argument.endMap();
return
argument;
}
You usually don't need to provide an operator<< or operator>> function for associative containers such as QHash or std::map, since Qt D-Bus provides generic templates to do the job of marshalling the data.
See Also▲
See also endMap(), beginStructure(), beginArray(), beginMapEntry()
void QDBusArgument::beginMap() const▲
Recurses into the D-Bus map to allow extraction of the map's elements.
This function is used usually in operator>> streaming operators, as in the following example:
// Extract a MyDictionary map that associates integers to MyElement items
const
QDBusArgument &
amp;operator
&
gt;&
gt;(const
QDBusArgument &
amp;argument, MyDictionary &
amp;myDict)
{
argument.beginMap();
myDict.clear();
while
(!
argument.atEnd()) {
int
key;
MyElement value;
argument.beginMapEntry();
argument &
gt;&
gt; key &
gt;&
gt; value;
argument.endMapEntry();
myDict.insert(key, value);
}
argument.endMap();
return
argument;
}
If the type you want to demarshall is a QMap or QHash, you need not declare an operator>> function for it, since Qt D-Bus provides generic templates to do the job of demarshalling the data.
See Also▲
See also endMap(), beginStructure(), beginArray(), beginMapEntry()
void QDBusArgument::beginMapEntry()▲
Opens a D-Bus map entry suitable for appending the key and value entries. This function is only valid when a map has been opened with beginMap().
See beginMap() for an example of usage of this function.
See Also▲
See also endMapEntry(), beginMap()
void QDBusArgument::beginMapEntry() const▲
Recurses into the D-Bus map entry to allow extraction of the key and value pair.
See beginMap() for an example of how this function is usually used.
See Also▲
See also endMapEntry(), beginMap()
void QDBusArgument::beginStructure()▲
Opens a new D-Bus structure suitable for appending new arguments.
This function is used usually in operator<< streaming operators, as in the following example:
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyStructure &
amp;myStruct)
{
argument.beginStructure();
argument &
lt;&
lt; myStruct.member1 &
lt;&
lt; myStruct.member2;
argument.endStructure();
return
argument;
}
Structures can contain other structures, so the following code is also valid:
QDBusArgument &
amp;operator
&
lt;&
lt;(QDBusArgument &
amp;argument, const
MyStructure &
amp;myStruct)
{
argument.beginStructure();
argument &
lt;&
lt; myStruct.member1 &
lt;&
lt; myStruct.member2;
argument.beginStructure();
argument &
lt;&
lt; myStruct.member3.subMember1 &
lt;&
lt; myStruct.member3.subMember2;
argument.endStructure();
argument &
lt;&
lt; myStruct.member4;
argument.endStructure();
return
argument;
}
See Also▲
See also endStructure(), beginArray(), beginMap()
void QDBusArgument::beginStructure() const▲
Opens a D-Bus structure suitable for extracting elements.
This function is used usually in operator>> streaming operators, as in the following example:
const
QDBusArgument &
amp;operator
&
gt;&
gt;(const
QDBusArgument &
amp;argument, MyStructure &
amp;myStruct)
{
argument.beginStructure();
argument &
gt;&
gt; myStruct.member1 &
gt;&
gt; myStruct.member2 &
gt;&
gt; myStruct.member3;
argument.endStructure();
return
argument;
}
See Also▲
See also endStructure(), beginArray(), beginMap()
QDBusArgument::ElementType QDBusArgument::currentType() const▲
Returns the classification of the current element type. If an error decoding the type occurs or if we're at the end of the argument, this function returns QDBusArgument::UnknownType.
This function only makes sense when demarshalling arguments. If it is used while marshalling, it will always return UnknownType.
void QDBusArgument::endArray()▲
Closes a D-Bus array opened with beginArray(). This function must be called same number of times that beginArray() is called.
See Also▲
See also beginArray(), endStructure(), endMap()
void QDBusArgument::endArray() const▲
Closes the D-Bus array and allow extracting of the next element after the array.
See Also▲
See also beginArray()
void QDBusArgument::endMap()▲
Closes a D-Bus map opened with beginMap(). This function must be called same number of times that beginMap() is called.
See Also▲
See also beginMap(), endStructure(), endArray()
void QDBusArgument::endMap() const▲
Closes the D-Bus map and allow extracting of the next element after the map.
See Also▲
See also beginMap()
void QDBusArgument::endMapEntry()▲
Closes a D-Bus map entry opened with beginMapEntry(). This function must be called same number of times that beginMapEntry() is called.
See Also▲
See also beginMapEntry()
void QDBusArgument::endMapEntry() const▲
Closes the D-Bus map entry and allow extracting of the next element on the map.
See Also▲
See also beginMapEntry()
void QDBusArgument::endStructure()▲
Closes a D-Bus structure opened with beginStructure(). This function must be called same number of times that beginStructure() is called.
See Also▲
See also beginStructure(), endArray(), endMap()
void QDBusArgument::endStructure() const▲
Closes the D-Bus structure and allow extracting of the next element after the structure.
See Also▲
See also beginStructure()
void QDBusArgument::swap(QDBusArgument &other)▲
Swaps this QDBusArgument instance with other.
QDBusArgument &QDBusArgument::operator<<(uchar arg)▲
Appends the primitive value arg of type BYTE to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(bool arg)▲
This is an overloaded function.
Appends the primitive value arg of type BOOLEAN to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(short arg)▲
This is an overloaded function.
Appends the primitive value arg of type INT16 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(ushort arg)▲
This is an overloaded function.
Appends the primitive value arg of type UINT16 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(int arg)▲
This is an overloaded function.
Appends the primitive value arg of type INT32 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(uint arg)▲
This is an overloaded function.
Appends the primitive value arg of type UINT32 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(qlonglong arg)▲
This is an overloaded function.
Appends the primitive value arg of type INT64 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(qulonglong arg)▲
This is an overloaded function.
Appends the primitive value arg of type UINT64 to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(double arg)▲
This is an overloaded function.
Appends the primitive value arg of type DOUBLE (double-precision floating-point) to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(const QString &arg)▲
This is an overloaded function.
Appends the primitive value arg of type STRING (Unicode character string) to the D-Bus stream.
QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)▲
This is an overloaded function.
Appends the primitive value arg of type VARIANT to the D-Bus stream.
A D-Bus variant type can contain any type, including other variants. It is similar to the Qt QVariant type.
QDBusArgument &QDBusArgument::operator<<(const QStringList &arg)▲
This is an overloaded function.
Appends the QStringList given by arg as ARRAY of STRING to the D-Bus stream.
QStringList and QByteArray are the only two non-primitive types that are supported directly by QDBusArgument because of their widespread usage in Qt applications.
Other arrays are supported through compound types in Qt D-Bus.
QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)▲
This is an overloaded function.
Appends the QByteArray given by arg as ARRAY of BYTE to the D-Bus stream.
QStringList and QByteArray are the only two non-primitive types that are supported directly by QDBusArgument because of their widespread usage in Qt applications.
Other arrays are supported through compound types in Qt D-Bus.
QDBusArgument &QDBusArgument::operator=(const QDBusArgument &other)▲
Copies the other QDBusArgument object into this one.
Both objects will therefore contain the same state from this point forward. QDBusArguments are explicitly shared and, therefore, any modification to either copy will affect the other one too.
const QDBusArgument &QDBusArgument::operator>>(uchar &arg) const▲
Extracts one D-BUS primitive argument of type BYTE from the D-BUS stream and puts it into arg.
const QDBusArgument &QDBusArgument::operator>>(bool &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type BOOLEAN from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(short &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type INT16 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(ushort &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type UINT16 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(int &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type INT32 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(uint &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type UINT32 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(qlonglong &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type INT64 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(qulonglong &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type UINT64 from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(double &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type DOUBLE (double-precision floating point) from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(QString &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type STRING (Unicode character string) from the D-Bus stream.
const QDBusArgument &QDBusArgument::operator>>(QDBusVariant &arg) const▲
This is an overloaded function.
Extracts one D-Bus primitive argument of type VARIANT from the D-Bus stream.
A D-Bus variant type can contain any type, including other variants. It is similar to the Qt QVariant type.
In case the variant contains a type not directly supported by QDBusArgument, the value of the returned QDBusVariant will contain another QDBusArgument. It is your responsibility to further demarshall it into another type.
const QDBusArgument &QDBusArgument::operator>>(QStringList &arg) const▲
This is an overloaded function.
Extracts an array of strings from the D-Bus stream and return it as a QStringList.
QStringList and QByteArray are the only two non-primitive types that are supported directly by QDBusArgument because of their widespread usage in Qt applications.
Other arrays are supported through compound types in Qt D-Bus.
const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const▲
This is an overloaded function.
Extracts an array of bytes from the D-Bus stream and return it as a QByteArray.
QStringList and QByteArray are the only two non-primitive types that are supported directly by QDBusArgument because of their widespread usage in Qt applications.
Other arrays are supported through compound types in Qt D-Bus.
Related Non-Members▲
QMetaType qDBusRegisterMetaType()▲
Registers T with the Qt D-Bus Type System and the Qt meta-type system, if it's not already registered.
To register a type, it must be declared as a meta-type with the Q_DECLARE_METATYPE() macro, and then registered as in the following example:
#include <QDBusMetaType>
qDBusRegisterMetaType&
lt;MyClass&
gt;();
If T isn't one of Qt's container classes, the operator<< and operator>> streaming operators between T and QDBusArgument must be already declared. See the Qt D-Bus Type System page for more information on how to declare such types.
This function returns the Qt meta type id for the type (the same value that is returned from qRegisterMetaType()).
The feature that a T inheriting a streamable type (including the containers QList, QHash or QMap) can be streamed without providing custom operator<< and operator>> is deprecated as of Qt 5.7, because it ignores everything in T except the base class. There is no diagnostic. You should always provide these operators for all types you wish to stream and not rely on Qt-provided stream operators for base classes.
This function is thread-safe.
See Also▲
See also Qt D-Bus Type System, qRegisterMetaType(), QMetaType
T qdbus_cast(const QDBusArgument &arg)▲
Attempts to demarshall the contents of arg into the type T. For example:
MyType item =
qdbus_cast&
lt;Type&
gt;(argument);
Note that it is equivalent to the following:
MyType item;
argument &
gt;&
gt; item;