类Dummy
,派生自QObject
,注册
Q_DECLARE_METATYPE(Dummy)
qRegisterMetaType<Dummy>("Dummy");
qDBusRegisterMetaType<Dummy>();
当我发送Dummy
asQDBusVariant
时,插槽被正确调用,但值 (of Dummy
) 是默认值。注意到解组操作符永远不会被调用(marshalling is)。通过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