3

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

Replica 上的 InvokeMethod 似乎不支持返回值。我只成功地调用了 void 返回槽,即使在这种情况下,在 DirectConnection 模式下,invokeMethod 在主机槽调用之前完成,所以似乎没有主机应答在等待。

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

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

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

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

感谢帮助。

4

1 回答 1

3

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

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();

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

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

于 2019-08-09T20:19:51.087 回答