Класс QDBusArgument
Класс QDBusArgument используется для маршалинга и демаршалинга аргументов D-Bus. Подробнее...
| Заголовок: | #include <QDBusArgument> |
| qmake: | QT += dbus |
| С версии: | Qt 4.2 |
Открытые типы
| enum | ElementType { BasicType, VariantType, ArrayType, StructureType, ..., UnknownType } |
Открытые функции
| QDBusArgument() | |
| QDBusArgument(const QDBusArgument &other) | |
| QDBusArgument(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<<(uchar arg) |
| QDBusArgument & | operator<<(bool arg) |
| QDBusArgument & | operator<<(short arg) |
| QDBusArgument & | operator<<(ushort arg) |
| QDBusArgument & | operator<<(int arg) |
| QDBusArgument & | operator<<(uint arg) |
| QDBusArgument & | operator<<(qlonglong arg) |
| QDBusArgument & | operator<<(qulonglong arg) |
| QDBusArgument & | operator<<(double arg) |
| QDBusArgument & | operator<<(const QString &arg) |
| QDBusArgument & | operator<<(const QDBusVariant &arg) |
| QDBusArgument & | operator<<(const QStringList &arg) |
| QDBusArgument & | operator<<(const QByteArray &arg) |
| QDBusArgument & | operator=(QDBusArgument &&other) |
| QDBusArgument & | operator=(const QDBusArgument &other) |
| const QDBusArgument & | operator>>(uchar &arg) const |
| const QDBusArgument & | operator>>(bool &arg) const |
| const QDBusArgument & | operator>>(short &arg) const |
| const QDBusArgument & | operator>>(ushort &arg) const |
| const QDBusArgument & | operator>>(int &arg) const |
| const QDBusArgument & | operator>>(uint &arg) const |
| const QDBusArgument & | operator>>(qlonglong &arg) const |
| const QDBusArgument & | operator>>(qulonglong &arg) const |
| const QDBusArgument & | operator>>(double &arg) const |
| const QDBusArgument & | operator>>(QString &arg) const |
| const QDBusArgument & | operator>>(QDBusVariant &arg) const |
| const QDBusArgument & | operator>>(QStringList &arg) const |
| const QDBusArgument & | operator>>(QByteArray &arg) const |
Связанные внешние функции
| int | qDBusRegisterMetaType() |
| T | qdbus_cast(const QDBusArgument &arg) |
Подробное описание
Класс QDBusArgument используется для преобразования и обратного преобразования аргументов D-Bus.
Класс используется для отправки аргументов по 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()
Конструирует пустой аргумент QDBusArgument.
Пустой объект QDBusArgument не позволяет выполнять ни чтение, ни запись.
QDBusArgument::QDBusArgument(const QDBusArgument &other)
Конструирует копию объекта QDBusArgument other.
Оба объекта, следовательно, будут содержать одинаковое состояние с этого момента. QDBusArgument явно разделяются, и, следовательно, любые изменения в одной копии также повлияют на другую.
QDBusArgument::QDBusArgument(QDBusArgument &&other)
Конструктор копирования перемещения.
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 ( !argMap.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<<(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 QStringList &arg)
Это перегруженная функция.
Добавляет QStringList, заданную arg, как ARRAY of STRING в поток D-Bus.
QStringList и QByteArray — единственные два не примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)
Это перегруженный метод.
Добавляет QByteArray, заданный arg, как ARRAY of BYTE в поток D-Bus.
QStringList и QByteArray — единственные два не примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
QDBusArgument &QDBusArgument::operator=(QDBusArgument &&other)
Оператор перемещающего присваивания.
QDBusArgument &QDBusArgument::operator=(const QDBusArgument &other)
Копирует объект other QDBusArgument в этот объект.
Оба объекта, следовательно, будут содержать одинаковое состояние с этого момента. QDBusArgument явным образом объединены, и поэтому любые изменения в одной из копий будут влиять и на другую.
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 QString &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>>(QStringList &arg) const
Это перегруженный метод.
Извлекает массив строк из потока D-Bus и возвращает его как QStringList.
QStringList и QByteArray — единственные два не примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
const QDBusArgument &QDBusArgument::operator>>(QByteArray &arg) const
Это перегруженный метод.
Извлекает массив байтов из потока D-Bus и возвращает его как QByteArray.
QStringList и QByteArray — единственные два не примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.
Другие массивы поддерживаются через составные типы в Qt D-Bus.
Связанные нечлены
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.
T qdbus_cast(const QDBusArgument &arg)
Пытается распарсить содержимое 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/archives/qt-5.11/qdbusargument.html