Spec-Zone.ru › Qt 5.14

Класс QDBusArgument

Класс QDBusArgument используется для маршалинга и демаршалинга аргументов D-Bus. Подробнее...

Header: #include <QDBusArgument>
qmake: QT += dbus
Since: Qt 4.2

Этот класс был введён в Qt 4.2.

  • Список всех членов, включая унаследованные члены

Открытые типы

enum 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)
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 QByteArray &arg)
const QDBusArgument & operator>>(QStringList &arg) const
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>>(QByteArray &arg) const

Связанные внешние функции

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().

Документация по типам членов

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<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.

Эта функция обычно используется в операторах потоковой обработки, как в следующем примере:

// 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, принимающих один шаблонный параметр, вам не нужно объявлять функцию, так как Qt D-Bus предоставляет универсальные шаблоны для обработки маршаллирования данных. То же самое относится к контейнерам последовательностей STL, таким как QList, QVector и т. д.

См. также endArray(), beginStructure() и beginMap().

void QDBusArgument::beginArray() const

Возвращается в массив D-Bus, чтобы разрешить извлечение элементов массива.

Эта функция обычно используется в операторах потоковой обработки, как в следующем примере:

// 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, принимающих один шаблонный параметр, вам не нужно объявлять функцию, так как Qt D-Bus предоставляет универсальные шаблоны для обработки демаршаллирования данных. То же самое относится к контейнерам последовательностей STL, таким как QList, QVector и т. д.

См. также atEnd(), beginStructure() и beginMap().

void QDBusArgument::beginMap(int kid, int vid)

Открывает новую карту D-Bus, подходящую для добавления элементов. Карты — это контейнеры, которые связывают один элемент (ключ) с другим (значение), например, Qt QMap или QHash. Идентификаторы метатипов ключа и значения карты должны быть переданы в kid и vid соответственно.

Эта функция обычно используется в операторах потоковой обработки, как в следующем примере:

// 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, вам не нужно объявлять функцию для него, так как Qt D-Bus предоставляет универсальные шаблоны для обработки маршаллирования данных.

См. также endMap(), beginStructure(), beginArray() и beginMapEntry().

void QDBusArgument::beginMap() const

Возвращается в карту D-Bus, чтобы разрешить извлечение элементов карты.

Эта функция обычно используется в операторах потоковой обработки, как в следующем примере:

// 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, вам не нужно объявлять функцию для него, так как 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, в поток D-Bus в качестве списка строк.

QStringList и QByteArray — единственные два не примитивных типа, которые напрямую поддерживаются QDBusArgument из-за их широкого использования в приложениях Qt.

Другие массивы поддерживаются через составные типы в Qt D-Bus.

QDBusArgument &QDBusArgument::operator<<(uchar arg)

Добавляет примитивное значение arg типа беззнакового 8-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(bool arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа булево в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(short arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа 16-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(ushort arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа беззнакового 16-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(int arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа 32-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(uint arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа беззнакового 32-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(qlonglong arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа 64-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(qulonglong arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа беззнакового 64-битного целого числа в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(double arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа числа с плавающей точкой двойной точности в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(const QString &arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа строки Юникода в поток D-Bus.

QDBusArgument &QDBusArgument::operator<<(const QDBusVariant &arg)

Это перегруженная функция.

Добавляет примитивное значение arg типа D-Bus-варианта в поток D-Bus.

Тип D-Bus-варианта может содержать любой тип, включая и другие варианты. Он похож на тип Qt QVariant.

QDBusArgument &QDBusArgument::operator<<(const QByteArray &arg)

Это перегруженный метод.

Добавляет QByteArray, заданный параметром arg, в поток 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.

Связанные нечлен-функции

int qDBusRegisterMetaType()

Регистрирует T в системе типов Qt D-Bus и системе метатипов Qt, если она ещё не зарегистрирована.

Для регистрации типа, он должен быть объявлен как метатип с помощью макроса Q_DECLARE_METATYPE(), а затем зарегистрирован, как в примере ниже:

#include <QDBusMetaType>
qDBusRegisterMetaType<MyClass>();

Если T не является одним из контейнерных классов Qt, операторы потокового ввода-вывода между T и QDBusArgument должны быть объявлены. Подробности смотрите на странице Система типов Qt D-Bus.

Функция возвращает идентификатор метатипа Qt для типа (такое же значение, что и возвращаемое функцией qRegisterMetaType()).

Примечание: Функциональность, позволяющая типу, наследующемуся от потокового типа (включая контейнеры QList, QHash или QMap) быть потоковым без предоставления пользовательских операторов потокового ввода-вывода, устарела начиная с Qt 5.7, так как игнорирует всё в T кроме базового класса. Нет диагностики. Вы всегда должны предоставлять эти операторы для всех типов, которые вы хотите передать через поток, а не полагаться на операторы потокового ввода-вывода Qt для базовых классов.

Примечание: Эта функция безопасна для многопоточных операций.

Функция была добавлена в Qt 4.2.

См. также Система типов Qt D-Bus, qRegisterMetaType() и QMetaType.

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.14/qdbusargument.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API