0

Dummy,派生自QObject,注册

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

当我发送DummyasQDBusVariant时,插槽被正确调用,但值 (of Dummy) 是默认值。注意到解组操作符永远不会被调用(marshalling is)。通过DBusMonitor我可以看到值是正确发送的。

我认为它失败了,因为该运算符QDBusArgument &operator<<(const QDBusVariant &arg);被调用并且仅适用于 Qt 标准类型。如果我把一个包裹QString进去QVariantQDBusVariant它就可以正常工作。

如何解决问题?

/*!
 * \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. Qt 5.1 Win32
  2. 这在这里描述了一个类似的问题,截至发布日期没有答案:Qt QDbus Sending Custom Types with QVariant
4

1 回答 1

2

诀窍是,接收到QVariant的复杂类型是 type QDBusArgument。如果可以解组为所需的目标类型,那么这样做的方法是:qv.value<QDBusArgument>() >> someConcreteObject

于 2013-10-10T18:19:11.180 回答