Spec-Zone.ru › Qt 6.0

Класс QDBusArgument

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

Заголовок: #include <QDBusArgument>
CMake: find_package(Qt6 COMPONENTS Dbus REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Dbus)
qmake: QT += dbus
  • Список всех членов, включая унаследованные

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

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(QMetaType id)
void beginArray() const
void beginMap(QMetaType keyMetaType, QMetaType valueMetaType)
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

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

QMetaType qDBusRegisterMetaType()
T qdbus_cast(const QDBusArgument &arg)

Подробное описание

Класс используется для отправки аргументов по 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>. Примечание: QByteArray и ассоциативные карты не считаются массивами, даже если протокол D-Bus транспортирует их как таковые.
QDBusArgument::StructureType 3 Пользовательский тип, представленный структурой, например, QDateTime, QPoint и т.д.
QDBusArgument::MapType 4 Ассоциативный контейнер, например, QMap<Key, Value> или QHash<Key, Value>
QDBusArgument::MapEntryType 5 Один элемент ассоциативного контейнера: и ключ, и значение образуют один тип элемента карты.
QDBusArgument::UnknownType -1 Тип неизвестен или достигнут конец списка.

См. также 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 с аргументом типа QMetaType::Int. Для массива INT32 она вернёт QVariant, содержащий QDBusArgument.

Если произошла ошибка или больше нет аргументов для декодирования (т. е. достигнут конец списка аргументов), эта функция вернёт недействительный QVariant.

См. также atEnd().

bool QDBusArgument::atEnd() const

Возвращает true если больше нет элементов для извлечения из этого QDBusArgument. Эта функция обычно используется в объектах QDBusArgument, возвращаемых beginMap() и beginArray().

void QDBusArgument::beginArray(QMetaType id)

Открывает новый массив D-Bus, подходящий для добавления элементов типа метаданных id.

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

// Append an array of MyElement types
QDBusArgument &operator<<(QDBusArgument &argument, const MyArray &myArray)
{
    argument.beginArray(qMetaTypeId<MyElement>());
    for (const auto &element : myArray)
        argument << element;
    argument.endArray();
    return argument;
}

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

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

void QDBusArgument::beginMap(QMetaType keyMetaType, QMetaType valueMetaType)

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

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

// Append a dictionary that associates ints to MyValue types
QDBusArgument &operator<<(QDBusArgument &argument, const MyDictionary &myDict)
{
    argument.beginMap(QMetaType::fromType<int>(), QMetaType::fromType<MyValue>());
    MyDictionary::const_iterator i;
    for (i = myDict.cbegin(); i != myDict.cend(); ++i) {
        argument.beginMapEntry();
        argument << i.key() << i.value();
        argument.endMapEntry();
    }
    argument.endMap();
    return argument;
}

Обычно вам не нужно предоставлять функцию operator<< или operator>> для ассоциативных контейнеров, таких как QHash или std::map, так как Qt D-Bus предоставляет общие шаблоны для маршаллирования данных.

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

void QDBusArgument::beginMap() const

Рекурсивно входит в карту D-Bus для извлечения элементов карты.

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

// Extract a MyDictionary map that associates integers to MyElement items
const QDBusArgument &operator>>(const QDBusArgument &argument, MyDictionary &myDict)
{
    argument.beginMap();
    myDict.clear();

    while (!argument.atEnd()) {
        int key;
        MyElement value;
        argument.beginMapEntry();
        argument >> key >> value;
        argument.endMapEntry();
        myDict.insert(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.

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)

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

Добавляет переданный QStringListarg в поток D-Bus, как ARRAY of STRING.

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> QMetaType 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 D-Bus, qRegisterMetaType() и QMetaType.

template <typename T> T qdbus_cast(const QDBusArgument &arg)

Попытка разархивировать содержимое arg в тип T. Например:

MyType item = qdbus_cast<Type>(argument);

Обратите внимание, что это эквивалентно следующему:

MyType item;
argument >> item;

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qdbusargument.html

Spec-Zone.ru

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