Класс QDBusArgument
Класс QDBusArgument используется для маршаллирования и демаршаллирования аргументов D-Bus. Подробнее...
| Заголовок: | #include <QDBusArgument> |
| qmake: | QT += dbus |
| С момента: | Qt 4.2 |
Этот класс был представлен в Qt 4.2.
Общедоступные типы
| Перечисление | ElementType { BasicType, VariantType, ArrayType, StructureType, MapType, …, UnknownType } |
Общедоступные функции
| QDBusArgument(const QDBusArgument &other) | |
| QDBusArgument() | |
| QDBusArgument & | operator=(const QDBusArgument &other) |
| ~QDBusArgument() | |
| QVariant | asVariant() const |
| bool | atEnd() const |
| void | beginArray(int id) |
| void | beginArray() const |
| void | beginMap(int kid, int vid) |
| void | beginMap() const |
| 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<<(const QStringList &arg) |
| QDBusArgument & | operator<<(uchar arg) |
Связанные внечленённые члены
| int | qDBusRegisterMetaType() |
| T | qdbus_cast(const QDBusArgument &arg, T * = nullptr) |
Подробное описание
Класс используется для отправки аргументов по D-Bus удалённым приложениям и для получения их обратно. D-Bus предлагает расширяемую систему типов, основанную на нескольких примитивных типах и их объединениях. Подробнее о системе типов см. на странице Система типов Qt D-Bus.
QDBusArgument — центральный класс в системе типов Qt D-Bus, предоставляющий функции для маршаллирования и демаршаллирования примитивных типов. Сложные типы создаются путём объединения одного или нескольких примитивных типов в массивы, словари или структуры.
Следующий пример иллюстрирует, как можно создать структуру, содержащую целое число и строку, используя систему типов Qt 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;
} Тип необходимо зарегистрировать с помощью qDBusRegisterMetaType() перед использованием с QDBusArgument. Поэтому где-то в вашей программе необходимо добавить следующий код:
qDBusRegisterMetaType<MyStructure>();
После регистрации тип можно использовать в вызовах исходящих методов (вместе с QDBusAbstractInterface::call()), при выводе сигналов из зарегистрированных объектов или при входящих вызовах от удалённых приложений.
Важно отметить, что функции потоковой обработки operator<< и operator>> всегда должны производить одинаковое количество записей в случае структур, как при чтении, так и при записи (маршаллировании и демаршаллировании), в противном случае вызовы и сигналы могут начать молчаливо завершаться неудачей.
Следующий пример иллюстрирует эту неправильную работу в контексте класса, который может содержать некорректные данные:
//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;
} В этом примере функции operator<< и operator>> могут производить разное количество чтений/записей. Это может сбить с толку систему типов Qt D-Bus и следует избегать.
См. также QDBusAbstractInterface, Система типов Qt D-Bus, Использование адаптеров и qdbus_cast.
Документация по типам-членам
перечисление QDBusArgument::ElementType
Это перечисление описывает тип элемента, хранящегося в аргументе.
| Константа | Значение | Описание |
|---|---|---|
QDBusArgument::BasicType |
0 |
Базовый элемент, который понимается QVariant. К базовым типам относятся: bool, byte, short, ushort, int, uint, qint64, quint64, double, QString, QByteArray, QDBusObjectPath, QDBusSignature |
QDBusArgument::VariantType |
1 |
Элемент варианта (QDBusVariant) |
QDBusArgument::ArrayType |
2 |
Элемент массива, обычно представленный QList<T> или QVector<T>. Примечание: QByteArray и ассоциативные карты не считаются массивами, даже если протокол D-Bus их транспортирует как таковые. |
QDBusArgument::StructureType |
3 |
Пользовательский тип, представленный структурой, например, QDateTime, QPoint и т.д. |
QDBusArgument::MapType |
4 |
Ассоциативный контейнер, например, QMap<Key, Value> или QHash<Key, Value> |
QDBusArgument::MapEntryType |
5 |
Одна запись в ассоциативном контейнере: и ключ, и значение образуют один тип записи карты. |
QDBusArgument::UnknownType |
-1 |
Тип неизвестен или достигнут конец списка. |
Это перечисление было добавлено или изменено в Qt 4.5.
См. также currentType().
Документация по функциям-членам
QDBusArgument::QDBusArgument(const QDBusArgument &other)
Создаёт копию объекта QDBusArgument other.
Оба объекта будут, следовательно, содержать одинаковое состояние с этого момента. QDBusArgument явно объединены, поэтому любые изменения в одной копии повлияют на другую.
QDBusArgument::QDBusArgument()
Создаёт пустой аргумент QDBusArgument.
Пустой объект QDBusArgument не позволяет выполнять ни чтение, ни запись.
QDBusArgument &QDBusArgument::operator=(const QDBusArgument &other)
Копирует объект QDBusArgument other в текущий.
Оба объекта будут, следовательно, содержать одинаковое состояние с этого момента. QDBusArgument явно объединены, поэтому любые изменения в одной копии повлияют на другую.
QDBusArgument::~QDBusArgument()
Удаляет ресурсы, связанные с этим объектом QDBusArgument.
QVariant QDBusArgument::asVariant() const
Возвращает текущий аргумент в виде QVariant. Базовые типы будут декодированы и возвращены в QVariant, но для сложных типов эта функция вернёт объект QDBusArgument в QVariant. Ответственность за декодирование аргумента лежит на вызывающей стороне (например, вызовом asVariant() в нём).
Например, если текущий аргумент — INT32, эта функция вернёт QVariant с аргументом типа QVariant::Int. Для массива INT32 она вернёт QVariant, содержащий QDBusArgument.
Если произошла ошибка или больше нет аргументов для декодирования (т.е. достигнут конец списка аргументов), эта функция вернёт недействительный QVariant.
Эта функция была добавлена в Qt 4.5.
См. также atEnd().
bool QDBusArgument::atEnd() const
Возвращает true , если больше нет элементов для извлечения из QDBusArgument. Эта функция обычно используется в объектах QDBusArgument, возвращаемых из beginMap() и beginArray().
void QDBusArgument::beginArray(int id)
Открывает новый массив D-Bus, подходящий для добавления элементов типа id.
Эта функция обычно используется в операторах потоковой обработки operator<<, как в следующем примере:
// append an array of MyElement types
QDBusArgument &operator<<(QDBusArgument &argument, const MyArray &myarray)
{
argument.beginArray( qMetaTypeId<MyElement>() );
for ( int i = 0; i < myarray.length; ++i )
argument << myarray.elements[i];
argument.endArray();
return argument;
} Если маршаллируемый тип — QList, QVector или любой контейнер Qt, принимающий один параметр шаблона, вам не нужно объявлять функцию operator<<, так как Qt D-Bus предоставляет универсальные шаблоны для маршаллирования данных. То же самое относится к контейнерам последовательностей STL, таким как std::list, std::vector, и т.д.
См. также endArray(), beginStructure(), и beginMap().
void QDBusArgument::beginArray() const
Рекурсивно входит в массив D-Bus, чтобы разрешить извлечение элементов массива.
Эта функция обычно используется в операторах потоковой обработки operator>>, как в следующем примере:
// 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;
} Если тип, который вы хотите демаршаллировать, — QList, QVector или любой контейнер Qt, принимающий один параметр шаблона, вам не нужно объявлять функцию operator>>, так как Qt D-Bus предоставляет универсальные шаблоны для демаршаллирования данных. То же самое относится к контейнерам последовательностей STL, таким как std::list, std::vector, и т.д.
См. также atEnd(), beginStructure(), и beginMap().
void QDBusArgument::beginMap(int kid, int vid)
Открывает новую карту D-Bus, подходящую для добавления элементов. Карты — это контейнеры, которые связывают одну запись (ключ) с другой (значение), например, Qt's QMap или QHash. Идентификаторы метатипов ключа и значения карты должны быть переданы в kid и vid соответственно.
Эта функция обычно используется в операторах потоковой обработки operator<<, как в следующем примере:
// append a dictionary that associates ints to MyValue types
QDBusArgument &operator<<(QDBusArgument &argument, const MyDictionary &mydict)
{
argument.beginMap( QVariant::Int, qMetaTypeId<MyValue>() );
for ( int i = 0; i < mydict.length; ++i ) {
argument.beginMapEntry();
argument << mydict.data[i].key << mydict.data[i].value;
argument.endMapEntry();
}
argument.endMap();
return argument;
} Если маршаллируемый тип — QMap или QHash, вам не нужно объявлять функцию operator<< , так как Qt D-Bus предоставляет универсальные шаблоны для маршаллирования данных.
См. также endMap(), beginStructure(), beginArray(), и beginMapEntry().
void QDBusArgument::beginMap() const
Рекурсивно входит в карту D-Bus, чтобы разрешить извлечение элементов карты.
Эта функция обычно используется в операторах потоковой обработки operator>>, как в следующем примере:
// extract a MyDictionary map that associates ints to MyValue elements
const QDBusArgument &operator>>(const QDBusArgument &argument, MyDictionary &mydict)
{
argument.beginMap();
mydict.clear();
while ( !argument.atEnd() ) {
int key;
MyValue value;
argument.beginMapEntry();
argument >> key >> value;
argument.endMapEntry();
mydict.append( key, value );
}
argument.endMap();
return argument;
} Если тип, который вы хотите демаршаллировать, — QMap или QHash, вам не нужно объявлять функцию operator>> , так как Qt D-Bus предоставляет универсальные шаблоны для демаршаллирования данных.
См. также endMap(), beginStructure(), beginArray(), и beginMapEntry().
void QDBusArgument::beginMapEntry()
Открывает запись карты D-Bus, подходящую для добавления записей ключа и значения. Эта функция допустима только тогда, когда карта была открыта с помощью beginMap().
См. beginMap() для примера использования этой функции.
См. также endMapEntry() и beginMap().
void QDBusArgument::beginMapEntry() const
Рекурсивно входит в запись карты D-Bus, чтобы разрешить извлечение пары ключ-значение.
См. beginMap() для примера того, как обычно используется эта функция.
См. также endMapEntry() и beginMap().
void QDBusArgument::beginStructure()
Открывает новую структуру D-Bus, подходящую для добавления новых аргументов.
Эта функция обычно используется в операторах потоковой передачи operator<<, как в следующем примере:
QDBusArgument &operator<<(QDBusArgument &argument, const MyStructure &mystruct)
{
argument.beginStructure();
argument << mystruct.member1 << mystruct.member2 << ... ;
argument.endStructure();
return argument;
} Структуры могут содержать другие структуры, поэтому следующий код также допустим:
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;
} См. также endStructure(), beginArray() и beginMap().
void QDBusArgument::beginStructure() const
Открывает структуру D-Bus, подходящую для извлечения элементов.
Эта функция обычно используется в операторах потоковой передачи operator>>, как в следующем примере:
const QDBusArgument &operator>>(const QDBusArgument &argument, MyStructure &mystruct)
{
argument.beginStructure()
argument >> mystruct.member1 >> mystruct.member2 >> mystruct.member3 >> ...;
argument.endStructure();
return argument;
} См. также endStructure(), beginArray() и beginMap().
QDBusArgument::ElementType QDBusArgument::currentType() const
Возвращает классификацию текущего типа элемента. Если при декодировании типа возникает ошибка или если мы достигли конца аргумента, эта функция возвращает QDBusArgument::UnknownType.
Эта функция имеет смысл только при разборке аргументов. Если она используется при формировании, она всегда будет возвращать UnknownType.
Эта функция была добавлена в Qt 4.5.
void QDBusArgument::endArray()
Закрывает массив D-Bus, открытый с помощью beginArray(). Эта функция должна вызываться столько же раз, сколько и beginArray().
См. также beginArray(), endStructure() и endMap().
void QDBusArgument::endArray() const
Закрывает массив D-Bus и позволяет извлечь следующий элемент после массива.
См. также beginArray().
void QDBusArgument::endMap()
Закрывает карту D-Bus, открытую с помощью beginMap(). Эта функция должна вызываться столько же раз, сколько и beginMap().
См. также beginMap(), endStructure() и endArray().
void QDBusArgument::endMap() const
Закрывает карту D-Bus и позволяет извлечь следующий элемент после карты.
См. также beginMap().
void QDBusArgument::endMapEntry()
Закрывает запись карты D-Bus, открытую с помощью beginMapEntry(). Эта функция должна вызываться столько же раз, сколько и beginMapEntry().
См. также beginMapEntry().
void QDBusArgument::endMapEntry() const
Закрывает запись карты D-Bus и позволяет извлечь следующий элемент в карте.
См. также beginMapEntry().
void QDBusArgument::endStructure()
Закрывает структуру D-Bus, открытую с помощью beginStructure(). Эта функция должна вызываться столько же раз, сколько и beginStructure().
См. также beginStructure(), endArray() и endMap().
void QDBusArgument::endStructure() const
Закрывает структуру D-Bus и позволяет извлечь следующий элемент после структуры.
См. также beginStructure().
void QDBusArgument::swap(QDBusArgument &other)
Меняет местами этот экземпляр QDBusArgument с other.
QDBusArgument &QDBusArgument::operator<<(const QStringList &arg)
Это перегруженная функция.
Добавляет QStringList, заданный arg, как ARRAY of STRING в поток D-Bus.
QStringList и QByteArray — единственные два не-примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
QDBusArgument &QDBusArgument::operator<<(uchar arg)
Добавляет примитивное значение arg типа BYTE в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(bool arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа BOOLEAN в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(short arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа INT16 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(ushort arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа UINT16 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(int arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа INT32 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(uint arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа UINT32 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(qlonglong arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа INT64 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(qulonglong arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа UINT64 в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(double arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа DOUBLE (двойная точность с плавающей запятой) в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(const QString &arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа STRING (строка Юникод) в поток D-Bus.
QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)
Это перегруженная функция.
Добавляет примитивное значение arg типа VARIANT в поток D-Bus.
Тип варианта D-Bus может содержать любой тип, включая другие варианты. Он похож на тип Qt QVariant.
QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)
Это перегруженная функция.
Добавляет QByteArray, заданный arg, как ARRAY of BYTE в поток D-Bus.
QStringList и QByteArray — единственные два не-примитивных типа, напрямую поддерживаемые QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
const QDBusArgument &QDBusArgument::operator>>(QStringList &arg) const
Это перегруженная функция.
Извлекает массив строк из потока D-Bus и возвращает его как QStringList.
QStringList и QByteArray — единственные два не-примитивных типа, напрямую поддерживаемые QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
const QDBusArgument &QDBusArgument::operator>>(uchar &arg) const
Извлекает один примитивный аргумент D-BUS типа BYTE из потока D-BUS и помещает его в arg.
const QDBusArgument &QDBusArgument::operator>>(bool &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа BOOLEAN из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(short &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа INT16 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(ushort &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа UINT16 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(int &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа INT32 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(uint &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа UINT32 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(qlonglong &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа INT64 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(qulonglong &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа UINT64 из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(double &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа DOUBLE (число с плавающей запятой двойной точности) из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(QString &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа STRING (строка Юникод) из потока D-Bus.
const QDBusArgument &QDBusArgument::operator>>(QDBusVariant &arg) const
Это перегруженная функция.
Извлекает один примитивный аргумент D-Bus типа VARIANT из потока D-Bus.
Тип D-Bus варианта может содержать любой тип, включая другие варианты. Он похож на тип Qt QVariant.
В случае, если вариант содержит тип, не напрямую поддерживаемый QDBusArgument, значение возвращаемого QDBusVariant будет содержать другой QDBusArgument. Вам необходимо дополнительно его распаковать в другой тип.
const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const
Это перегруженная функция.
Извлекает массив байтов из потока D-Bus и возвращает его как QByteArray.
QStringList и QByteArray — единственные два не-примитивных типа, напрямую поддерживаемые QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
Связанные нечлены
template <typename T> int qDBusRegisterMetaType()
Регистрирует T в системе типов Qt D-Bus и системе метатипов Qt, если она ещё не зарегистрирована.
Для регистрации типа он должен быть объявлен как метатип с помощью макроса Q_DECLARE_METATYPE(), а затем зарегистрирован, как в следующем примере:
#include <QDBusMetaType> qDBusRegisterMetaType<MyClass>();
Если T не является одним из контейнерных классов Qt, операторы потоковой передачи operator<< и operator>> между T и QDBusArgument должны быть уже объявлены. См. страницу Система типов Qt D-Bus для получения дополнительной информации о том, как объявлять такие типы.
Эта функция возвращает идентификатор метатипа Qt для типа (то же значение, которое возвращает qRegisterMetaType()).
Примечание: Функциональность наследования потокового типа (включая контейнеры QList, QHash или QMap) может быть потоковой передачей без предоставления пользовательских операторов operator<< и operator>> устарела, начиная с Qt 5.7, так как она игнорирует все в T за исключением базового класса. Нет диагностики. Вы всегда должны предоставлять эти операторы для всех типов, которые вы хотите передать потоком, а не полагаться на предоставленные Qt операторы потоковой передачи для базовых классов.
Примечание: Эта функция потокобезопасна.
Эта функция была представлена в Qt 4.2.
См. также Система типов Qt D-Bus, qRegisterMetaType() и QMetaType.
template <typename T> T qdbus_cast(const QDBusArgument &arg, T * = nullptr)
Попытка распаковать содержимое arg в тип T. Например:
MyType item = qdbus_cast<Type>(argument);
Обратите внимание, что это эквивалентно следующему:
MyType item; argument >> item;
Эта функция была представлена в Qt 4.2.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qdbusargument.html