QtService和QtRemoteObject如何使它们协同工作

QtService和QtRemoteObject如何使它们协同工作,qt,service,Qt,Service,我正在尝试开发一个服务来远程一些定制的QObject(实际上这个QObject访问一些数据库并提供一些统计数据)。为此,我使用了QtService和QtRemoteObject,当我在一个简单的QCore应用程序中托管远程对象时,一切都很好,我可以连接到主机并运行插槽或获取信号,但当我在基于QtService的应用程序上托管远程对象时,我无法连接到主机,起初我想到了防火墙,因此,我为应用程序添加了入站-出站规则,但仍然不起作用。 代码有点大(serval文件),如果您需要它的任何部分,我将提供它

我正在尝试开发一个服务来远程一些定制的QObject(实际上这个QObject访问一些数据库并提供一些统计数据)。为此,我使用了QtService和QtRemoteObject,当我在一个简单的QCore应用程序中托管远程对象时,一切都很好,我可以连接到主机并运行插槽或获取信号,但当我在基于QtService的应用程序上托管远程对象时,我无法连接到主机,起初我想到了防火墙,因此,我为应用程序添加了入站-出站规则,但仍然不起作用。 代码有点大(serval文件),如果您需要它的任何部分,我将提供它

服务类别:

#include <QtService>
#include <QCoreApplication>
#include <QRemoteObjectHost>
#include "affairstatero.h"

class AffairStateService : public QtService<QCoreApplication>
{
public:
    explicit AffairStateService(int argc, char** argv, const QString& name = "affair_state");

    // QtServiceBase interface
protected:
    void start() override;
    void stop() override;
    void pause() override;
    void resume() override;

private:
    AffairStateRemoteObject* _affairStateRO;
    QRemoteObjectHost* _remotingHost;
};
#包括
#包括
#包括
#包括“affairstatero.h”
服务类别:公共服务
{
公众:
显式AffairStateService(int argc,char**argv,const QString&name=“事件状态”);
//QtServiceBase接口
受保护的:
void start()覆盖;
无效停止()覆盖;
无效暂停()覆盖;
无效恢复()覆盖;
私人:
affairstatemoteobject*_affairStateRO;
QRemoteObjectHost*\u远程主机;
};
cpp:

#包括“affairstateservice.h”
#包括
#包括
AffairStateService::AffairStateService(int-argc,char**argv,const-QString&name):
QtService(argc、argv、name)
{
这->设置服务描述(“报告事件状态”);
此->设置服务标签(QtService::CanBeSuspended);

qDebug()好的,我会回答我自己的问题,问题是在服务器端,我通过执行
QRemoteObjectHost::enableRemoting(&object,“object”);
为远程对象命名,但在客户端,我只是获取了一个副本,没有提供源名称,比如
QRemoteObjectNode::acquire();

我不太清楚,但我猜QtRemoteObject会将不带名称的远程对象设置为不带名称的默认对象,但在命名远程对象时,我们需要获取具有相同名称的副本,即使源仅远程处理一个对象

当在服务器端以
QRemoteObjectHost::enableRemoting(&obj,“object”);
的形式远程处理对象时,在客户端,我们需要
QRemoteObjectNode::acquire(“object”);

这与QT服务无关

#include "affairstateservice.h"
#include <QDebug>
#include <QSqliteSettings>

AffairStateService::AffairStateService(int argc, char **argv, const QString &name):
    QtService(argc,argv,name)
{
    this->setServiceDescription("report affair states.");
    this->setServiceFlags(QtService::CanBeSuspended);
    qDebug() << "service starting ...";
}

void AffairStateService::start()
{
    _affairStateRO = new AffairStateRemoteObject();
    _remotingHost = new QRemoteObjectHost();
    qInfo() << "Starting the service";
    QSqliteSettings settings;
    qInfo() << "Settings filename " << settings.fileName() << settings.organizationName() << settings.applicationName();
    _affairStateRO->startTimer();
    _remotingHost->setHostUrl(QUrl(settings.value("endpoint").toString()));
    _remotingHost->enableRemoting(_affairStateRO, "AffairStateRO");
    qInfo() << "Remoting on " << _remotingHost->hostUrl().toString();
    qInfo() << "Done";
}

void AffairStateService::stop()
{
    _affairStateRO->stopTimer();
    _remotingHost->disableRemoting(_affairStateRO);
}

void AffairStateService::pause()
{
    _remotingHost->disableRemoting(_affairStateRO);
}

void AffairStateService::resume()
{
    _remotingHost->enableRemoting(_affairStateRO);
}