当作为QDBusVariant/QVariant发送时,Qt DBus解组
Qt DBus unmarshalling when sent as QDBusVariant / QVariant
类别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);
备注:
- 问题5.1 Win32
- 这里描述了一个类似的问题,截至发布日期没有答案:Qt QDbus使用QVariant发送自定义类型
诀窍是,接收到的复杂类型的QVariant
是QDBusArgument
类型。如果可以将其解组为所需的目标类型,那么执行此操作的方法是:qv.value<QDBusArgument>() >> someConcreteObject
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- Windows Qt 二进制安装程序是否支持开箱即用的 DBus
- QT-Dbus 信号/插槽
- QT DBUS 挂载文件系统
- 如何在Qt DBus调用中从QDBusMessage中提取返回的数据
- 这个Qt DBus信号连接代码是否正确
- Qt DBus 属性转换为映射
- 在Qt C++中连接用户特定的DBus会话
- Qt DBus未接收信号
- Qt中的Dbus org.bluez实现
- Qt-DBus:实现多个接口的注册对象
- 当作为QDBusVariant/QVariant发送时,Qt DBus解组
- 如何使用cmake启用qt dbus封送
- Qt DBus监视器方法调用