是否可以从 QRemoteObject 动态副本槽获取返回值?

Dae*_*aes 5 qt qt-slot qtremoteobjects

我无法调用返回 QRemoteObjectDynamicReplica 上的值的插槽。

Replica 上的 InvokeMethod 似乎不支持返回值。我仅成功调用 void 返回插槽,即使在这种情况下,在 DirectConnection 模式下,invokeMethod 在主机插槽调用之前完成,因此似乎没有主机答案在等待。

我有这样的代码,它在主机端完美运行,但在副本端却不起作用。

  bool success = QMetaObject::invokeMethod(_replica,"getName", Qt::DirectConnection,
      Q_RETURN_ARG(QString, retVal),
      Q_ARG(QString, "id")
   );
Run Code Online (Sandbox Code Playgroud)

如果我很好地理解 REPC 的主题(我还没有尝试过),似乎调用返回值槽是可能的:用法是 声明 SLOT,后跟用括号括起来的所需签名。返回值可以包含在声明中。如果跳过返回值,则生成的文件中将使用 void。

REPC 是否做了某种魔法来允许此功能,或者我错过了什么?

感谢帮助。

Dae*_*aes 5

对于那些正在寻找答案的人来说,有一种方法:):

QRemoteObjectPendingCall

无证论证。

bool success = QMetaObject::invokeMethod(_replica,"getName",Qt::DirectConnection,
    Q_RETURN_ARG(QRemoteObjectPendingCall, call),
    Q_ARG(QString, "id")
 );
auto e = call.error();// , QRemoteObjectPendingCall::InvalidMessage);

call.waitForFinished();

//QVERIFY(call.isFinished());

qDebug() << QMetaType::typeName(call.returnValue().type());

QString retVal = call.returnValue().toString();
Run Code Online (Sandbox Code Playgroud)

这与可用于 REPC 副本的未来对象完全相同(除非不是模板化的),没有文档,但有一些示例: Qt 远程对象集成测试

遗憾的是,目前(5.13.0)无法在 QML(QTBUG-77178)中获得待处理的回复,但 Qt 人们正在寻找它。