You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:08:10