Qt 6.3中QRemoteObject跨进程共享数据客户端编译报错求助
Qt Remote Objects客户端编译报错C2661问题解决
问题描述
参照Qt Remote Objects动态副本示例,基于Qt 6.3编写跨进程共享数据示例时,服务端编译正常,客户端编译失败,报错如下:
Error C2661 'SharedObject::SharedObject': no overloaded function takes 2 arguments C:\Qt\6.3.0\qtremoteobjects\src\remoteobjects\qremoteobjectnode.h 78
错误由代码行auto sharedObject = node.acquire<SharedObject>();引发。
服务端代码
// remoteobject.h #include <QRemoteObjectRegistry> #include <QRemoteObjectRegistryHost> #include <QRemoteObjectHost> class SharedObject : public QObject { Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) public: QString text() const { return m_text; } void setText(const QString& text) { if (m_text != text) { m_text = text; emit textChanged(m_text); } } signals: void textChanged(const QString& text); private: QString m_text; }; // main.cpp #include "remoteobject.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); SharedObject sharedObject; sharedObject.setObjectName("sharedObject"); QRemoteObjectHost host; host.setHostUrl(QUrl("local:sharedObject")); host.enableRemoting(&sharedObject); return a.exec(); }
客户端代码
// remoteobject.h #include <QRemoteObjectRegistry> #include <QRemoteObjectRegistryHost> #include <QRemoteObjectHost> class SharedObject : public QObject { Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) public: QString text() const { return m_text; } void setText(const QString& text) { if (m_text != text) { m_text = text; emit textChanged(m_text); } } signals: void textChanged(const QString& text); private: QString m_text; }; // main.cpp #include "remoteobject.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QRemoteObjectNode node; node.connectToNode(QUrl("local:sharedObject")); auto sharedObject = node.acquire<SharedObject>(); QObject::connect(sharedObject, &SharedObject::textChanged, [&](const QString& text) { qDebug() << "Text changed to:" << text; }); QTimer::singleShot(10000, [&]() { qDebug() << "Current text:" << sharedObject->text(); }); return a.exec(); }
错误原因
Qt Remote Objects的acquire<T>()方法要求T必须是由repc工具生成的副本类(Replica Class),或继承自QRemoteObjectReplica。你自定义的SharedObject是普通QObject子类,没有Qt内部创建副本所需的双参数构造函数,因此触发编译错误。
解决步骤
1. 编写REPC接口文件
创建sharedobject.repc文件,定义共享对象的接口:
class SharedObject { PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) };
2. 生成服务端和客户端代码
使用Qt的repc工具(或通过qmake/CMake配置自动生成):
- 服务端生成源类文件:
repc sharedobject.repc -o sharedobject_source.h - 客户端生成副本类文件:
repc -r sharedobject.repc -o sharedobject_replica.h
如果使用qmake,可在项目文件中添加:
# 服务端项目 REPC_SOURCE += sharedobject.repc # 客户端项目 REPC_REPLICA += sharedobject.repc
3. 修改服务端代码
服务端使用生成的源类作为基类:
// remoteobject.h #include "sharedobject_source.h" class SharedObject : public SharedObjectSource { Q_OBJECT public: SharedObject(QObject *parent = nullptr) : SharedObjectSource(parent) {} }; // main.cpp(无需修改,保持原逻辑即可) #include "remoteobject.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); SharedObject sharedObject; QRemoteObjectHost host; host.setHostUrl(QUrl("local:sharedObject")); host.enableRemoting(&sharedObject); return a.exec(); }
4. 修改客户端代码
客户端使用生成的副本类调用acquire:
// main.cpp #include "sharedobject_replica.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QRemoteObjectNode node; node.connectToNode(QUrl("local:sharedObject")); auto sharedObject = node.acquire<SharedObjectReplica>(); QObject::connect(sharedObject, &SharedObjectReplica::textChanged, [&](const QString& text) { qDebug() << "Text changed to:" << text; }); QTimer::singleShot(10000, [&]() { qDebug() << "Current text:" << sharedObject->text(); }); return a.exec(); }
说明
生成的副本类会自动继承QRemoteObjectReplica,并实现与服务端对象匹配的属性、信号和接口,符合acquire<T>()的要求。客户端无需再定义自己的SharedObject类,直接使用生成的副本类即可。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

