【问题标题】:Qt DBus unmarshalling when sent as QDBusVariant / QVariant作为 QDBusVariant / QVariant 发送时 Qt DBus 解组
【发布时间】:2013-07-19 18:07:15
【问题描述】:

Dummy,派生自QObject,已注册

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

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

我认为它失败了,因为运算符QDBusArgument &amp;operator&lt;&lt;(const QDBusVariant &amp;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

【问题讨论】:

    标签: c++ qt5 dbus


    【解决方案1】:

    诀窍在于,接收到的复杂类型的QVariantQDBusArgument 类型。如果可以解组为所需的目标类型,那么这样做的方法是:qv.value&lt;QDBusArgument&gt;() &gt;&gt; someConcreteObject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2015-02-18
      • 2014-03-27
      • 1970-01-01
      相关资源
      最近更新 更多