Класс QDBusArgument
Класс QDBusArgument используется для маршалинга и демаршалинга аргументов D-Bus. Подробнее...
| Заголовок: | #include <QDBusArgument> |
| qmake: | QT += dbus |
| С: | Qt 4.2 |
Открытые типы
| перечисление | 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 |
Защищенные переменные
| QDBusArgumentPrivate * | d |
Связанные нечлены
| 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().
Документация по типам членов
enum 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<Ключ, Значение> или QHash<Ключ, Значение> |
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 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/qt-5.12/qdbusargument.html