【发布时间】:2013-07-19 18:07:15
【问题描述】:
类Dummy,派生自QObject,已注册
Q_DECLARE_METATYPE(Dummy)
qRegisterMetaType<Dummy>("Dummy");
qDBusRegisterMetaType<Dummy>();
当我将Dummy 发送为QDBusVariant 时,插槽被正确调用,但(Dummy)的值是默认值。注意到从未调用过解组运算符(编组是)。通过DBusMonitor 可以看到发送的值是正确的。
我认为它失败了,因为运算符QDBusArgument &operator<<(const QDBusVariant &arg); 被调用并且仅适用于Qt 标准类型。如果我将QString 包装在QVariant 中QDBusVariant 它工作正常。
如何解决这个问题?
/*!
* \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);
备注:
- Qt 5.1 Win32
- 这里描述了一个类似的问题,截至发布日期没有答案:Qt QDbus Sending Custom Types with QVariant
【问题讨论】: