Qt DBus Cast QVariant для построения - PullRequest
0 голосов
/ 06 февраля 2020

Я слушаю по интерфейсу dbus "org.freedesktop.DBus.Properties" в процессе обновления RAU C. Меня интересует деталь, которая представляет собой кортеж dbus (isi).

Я определил эту структуру:

struct RaucProgress{
    int percentage;
    QString message;
    int nesting_depth;
    RaucProgress(){}
};
Q_DECLARE_METATYPE(RaucProgress)
QDBusArgument &operator<<(QDBusArgument &argument, const RaucProgress &job);
const QDBusArgument &operator>>(const QDBusArgument &argument, RaucProgress &job);
QDBusArgument& operator<<(QDBusArgument &argument, const RaucProgress &progress)
{
    argument.beginStructure();
    argument << progress.percentage << progress.message << progress.nesting_depth;
    argument.endStructure();
    return argument;
}

const QDBusArgument& operator>>(const QDBusArgument &argument, RaucProgress &progress)
{
    argument.beginStructure();
    argument >> progress.percentage >> progress.message >> progress.nesting_depth;
    argument.endStructure();
    return argument;
}

Использование в слоте, вызываемом адаптером dbus, выглядит например:

void Updater::onRaucPropertyChanged(const QString &interface, const QVariantMap &changed_properties, const QStringList &invalidated_properties)
{
    if(interface == DBUS_SERVICE_RAUC_INSTALLER && changed_properties.contains("Progress")){
        volatile RaucProgress prog2 = qvariant_cast<RaucProgress>(changed_properties.value("Progress"));
    }
}

Кажется, что объект prog2 содержит, казалось бы, случайные данные. Правильно ли выполнено приведение?

Просмотр объекта в отладчике:

enter image description here

...