当作为QDBusVariant/QVariant发送时,Qt DBus解组

Qt DBus unmarshalling when sent as QDBusVariant / QVariant

本文关键字:Qt DBus 解组 QDBusVariant QVariant      更新时间:2023-10-16

类别Dummy,源自QObject,注册

Q_DECLARE_METATYPE(Dummy)
qRegisterMetaType<Dummy>("Dummy");
qDBusRegisterMetaType<Dummy>();

当我将Dummy作为QDBusVariant发送时,插槽被正确调用,但值(Dummy)是默认值。注意到从未调用过解组运算符(marshalling是)。通过DBusMonitor,我可以看到该值被正确发送。

我认为它失败了,因为调用了运算符QDBusArgument &operator<<(const QDBusVariant &arg);,并且仅针对Qt标准类型工作。如果我在QDBusVariant中的QVariant中包装QString,它工作得很好。

如何解决问题?

/*!
 * brief operator << Marshalling
 * param argument
 * param dummy
 * return
 */
QDBusArgument &operator<<(QDBusArgument &argument, const Dummy& dummy)
{
    argument.beginStructure();
    argument << dummy.m_number; // qint32
    argument << dummy.m_string; // QString
    argument.endStructure();
    qDebug() << "Marshall to DBus" << dummy.m_number << dummy.m_string;
    return argument;
}
/*!
 * brief operator >> unmarshalling
 * param argument
 * param dummy
 * return
 */
const QDBusArgument &operator>>(const QDBusArgument &argument, Dummy &dummy)
{
    argument.beginStructure();
    argument >> dummy.m_number;
    argument >> dummy.m_string;
    argument.endStructure();
    qDebug() << "Unmarshall from DBus" << dummy.m_number << dummy.m_string;
    return argument;
}

发送:

        Dummy dummy(c++, "Moep");
        qDebug() << "Dummy is" << dummy;
        QVariant qv;
        qv.setValue(dummy);
        QDBusVariant qdv = QDBusVariant(qv);
        testserviceInterface.receiveVariant(qdv);

备注:

  1. 问题5.1 Win32
  2. 这里描述了一个类似的问题,截至发布日期没有答案:Qt QDbus使用QVariant发送自定义类型

诀窍是,接收到的复杂类型的QVariantQDBusArgument类型。如果可以将其解组为所需的目标类型,那么执行此操作的方法是:qv.value<QDBusArgument>() >> someConcreteObject