QRemoteObjectNode :: remoteObjectAdded信号不会触发

时间:2017-08-07 14:04:53

标签: qt remoteobject

在学习如何使用QtRO技术预览模块时,我尝试了一个简单的3节点网络(注册表节点,源对象远程节点和客户端节点)。

注册表节点main.cpp:

#include <QCoreApplication>
#include <QRemoteObjectRegistryHost>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRemoteObjectRegistryHost host(QUrl("tcp://127.0.0.1:5557"));

    return a.exec();
}

源节点main.cpp:

#include <QCoreApplication>
#include <QRemoteObjectHost>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QTimer timer;
    timer.start(10000);

    QRemoteObjectHost host;
    if(!host.setHostUrl(QUrl("tcp://127.0.0.1:5556"))) qDebug() << "Host url " << host.lastError();
    if(!host.setRegistryUrl(QUrl("tcp://127.0.0.1:5557"))) qDebug() << "Reg url " << host.lastError();

    if(!host.enableRemoting(&timer, "HostTimer")) qDebug() << "Remoting error " << host.lastError();

    return a.exec();
}

客户端节点main.cpp:

#include <QCoreApplication>
#include <QRemoteObjectNode>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRemoteObjectNode node(QUrl("tcp://127.0.0.1:5557"));

    QObject::connect(&node, &QRemoteObjectNode::remoteObjectAdded,
                     [](const QRemoteObjectSourceLocation& info){
        qDebug() << "New source added : " << info;
    });

    qDebug() << "Waiting for registry ";
    node.waitForRegistry(10000);

    qDebug() << "Already here sources : " << node.registry()->sourceLocations();

    QTimer timer;
    timer.start(5000);

    QObject::connect(&timer, &QTimer::timeout,
                     [&](){
        qDebug() << "New sources list : " << node.registry()->sourceLocations();
    });


    return a.exec();
}

我首先启动注册表节点,然后是客户端节点,最后是源节点,使用此启动序列,我希望启动remoteObjectAdded,但它没有。

我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我回答我的问题。

我在connect方法调用中使用了错误的信号源。

客户端节点将为:

#include <QCoreApplication>
#include <QRemoteObjectNode>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QRemoteObjectNode node(QUrl("tcp://127.0.0.1:5557"));

    QObject::connect(node.registry(), &QRemoteObjectRegistry::remoteObjectAdded,
                     [](const QRemoteObjectSourceLocation& info){
        qDebug() << "New source added : " << info;
    });

    qDebug() << "Waiting for registry ";
    node.waitForRegistry(10000);

    qDebug() << "Already here sources : " << node.registry()->sourceLocations();

    QTimer timer;
    timer.start(5000);

    QObject::connect(&timer, &QTimer::timeout,
                     [&](){
        qDebug() << "New sources list : " << node.registry()->sourceLocations();
    });


    return a.exec();
}

注册表是触发信号而非节点,在所有源节点连接到注册表之后它是声音逻辑,因此它会触发remoteObjectAdded信号。