无法使用 QML 远程对象连接错误:“connectionToSource 为空”

Posted

技术标签:

【中文标题】无法使用 QML 远程对象连接错误:“connectionToSource 为空”【英文标题】:Unable to connect using QML Remote Object with Error: "connectionToSource is null" 【发布时间】:2021-01-20 19:33:05 【问题描述】:

我正在尝试使用 Qt 远程对象来创建客户端服务器应用程序。 但是遇到了一个问题,说“connectionToSource 为空”。如何设置源连接?

我正在使用 .rep 文件创建服务器。我使用的代码如下:

数据模型

// Rep File (DataModel.rep)
class DataModel 
    PROP(double data)

服务器代码

// DataBroadcaster class (DataBroadcaster.h)
// DataBroadcaster class inherits DataModelSimpleSource.h (generated from .rep file)    
    #include "rep_DataModel_Source.h"
    class DataBroadcaster : public DataModelSimpleSource
    
        Q_OBJECT
        public:
            DataBroadcaster(QObject *parent = nullptr);
            ~DataBroadcaster();
        void Initialize();
            private:
            int QScopedPointer<QRemoteObjectHost> remoteHost;
    

// DataBroadcaster.cpp

DataBroadcaster::DataBroadcaster(QObject *parent): DataModelSimpleSource(parent)
DataBroadcaster::~DataBroadcaster()
void DataBroadcaster::Initialize()

    remoteHost.reset(new QRemoteObjectHost(QUrl(QStringLiteral("local:mydata"))));
    remoteHost->enableRemoting(this, "DataModel");

//服务器代码主函数

#include <QCoreApplication>
#include "DataBroadcaster.h"
int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    DataBroadcaster server;
    server.Initialize();    
    double count = 0.0;
    while(true)
    
        server.pushData(count + 0.1);
       
    return a.exec();

客户代码

// DataModelDataReplica is generated from .rep file used to generate source
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include "rep_DataModel_replica.h"

int main(int argc, char *argv[])

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    // registered as qml type in main
    qmlRegisterType<DataModelReplica>("CustomData", 1, 0, "MyData");
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) 
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    , Qt::QueuedConnection);
    engine.load(url);
    return app.exec();

QML 代码

// DisplayPage.qml Added to QML file    
import CustomData 1.0    
MyData 
    id: dataClient
    node: Node 
        registerUrl: "local:mydata"
    
    Button 
        id: btn
        text: "Server Data" 
        onClicked: 
            // displaying some data from source
            btn.text = dataClient.data
        
    

执行:

Server code is running
Client code is running but when trying to get data I get following error message in debugger
**"qt.remoteobjects: connectionToSource is null"**

我无法弄清楚我错过了什么。 如果有人对如何解决或在哪里寻找有任何想法,请提出建议。

【问题讨论】:

请提供minimal reproducible example @folibis 用代码更新帖子,这足以复制问题。 【参考方案1】:

我能够找到问题所在。在服务器代码主函数中,使用了永远不会退出的 while 循环,因此从未调用过“exec()”函数,并且从未启动过 Qt 事件循环,因为 Qt Remote 对象没有共享数据。所以我用Signal and Slot机制改变了下面的代码,创建了一个非阻塞函数。以下是我所做的代码更改。

//服务器代码主函数

#include <QCoreApplication>
#include "DataBroadcaster.h"
#include "ServerController.h"

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    DataBroadcaster server;
    server.Initialize(); 
    ServerController controller(&server);
    return a.exec();

// 服务器控制器

#include <QTimer>
#include "DataBroadcaster.h"

class ServerController : public QObject

Q_OBJECT
public:
    explicit ServerController(QObject *parent = nullptr, DataBroadcast *server = nullptr);
    ~ServerController();

public Q_SLOTS:
    void SendData();

private:
    QTimer timer;
    double count = 0.0; 
    DataBroadcast *m_server = nullptr;


ServerController::ServerController(QObject *parent, DataBroadcast *server): QObject(parent), m_server(server)

    connect(&timer, SIGNAL(timeout()), this, SLOT(SendData()));
    timer.start();


ServerController::~ServerController()

    timer.stop();


ServerController::SendData()

    count += 0.1;
    if(m_server != nullptr)
    
         m_server->pushData(count);
    

【讨论】:

以上是关于无法使用 QML 远程对象连接错误:“connectionToSource 为空”的主要内容,如果未能解决你的问题,请参考以下文章

连接滑块以控制 qml 相机的缩放

websocket握手代码期间无法连接signalR错误:400

C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数

连接失败: SQLState:'01000' SQL Server 错误: 53 [Microsoft][ODBC SQL Server Driver][DBNETLIB]Connec

[QML] Connections元素介绍

尝试连接 docker mysql 时,ResourcePool 无法从其主工厂或源错误获取资源