内部类变量中的读取访问冲突

科泰科

代码可以编译,但是当我尝试为now_Playingupdate_Data方法中的变量分配新值时,它会因变量访问错误而崩溃。

错误

同时,如果在此方法中您从new_Data [“ song_Name”]输出数据,则将显示数据,即变量包含数据。错误在于访问_song_Name,我什至无法为其分配简单的“值”。

在这种情况下,数据将在now_Playing内部读取,因为QML可以访问_song_Name变量

据我了解,这是由于对该函数的调用来自另一个类,对吗?如何解决?

一个从另一个类调用方法的类

#ifndef IC_SERVER_H
#define IC_SERVER_H

#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include "httprequesthandler.h"
#include "now_playing.h"

using namespace stefanfrings;

class IC_Server : public HttpRequestHandler {
    Q_OBJECT

public:
    explicit IC_Server(QObject *parent = nullptr);
    void service(HttpRequest &request, HttpResponse &response);

signals:

private:
    QByteArray _http_Data;
    QJsonDocument _json_Data;
    QJsonObject _json_Object;

    now_Playing *_NOW_PLAYING;

};

#endif // IC_SERVER_H
#include "ic_server.h"
#include <QDebug>

IC_Server::IC_Server(QObject *parent) : HttpRequestHandler(parent) {
}

void IC_Server::service(HttpRequest &request, HttpResponse &response) {
    _http_Data = request.getBody();
    _json_Data = QJsonDocument::fromJson(_http_Data);
    _json_Object = _json_Data.object();

    _NOW_PLAYING->update_Data(_json_Object);
}

处理数据的类

#ifndef NOW_PLAYING_H
#define NOW_PLAYING_H

#include <QObject>
#include <QJsonObject>

class now_Playing : public QObject {
    Q_OBJECT

    Q_PROPERTY(QString get_Source_Name READ get_Source_Name NOTIFY media_Changed)
    Q_PROPERTY(QString get_Song_Name READ get_Song_Name NOTIFY media_Changed)
    Q_PROPERTY(QString get_Album_Name READ get_Album_Name NOTIFY media_Changed)
    Q_PROPERTY(QString get_Album_Cover_URL READ get_Album_Cover_URL NOTIFY media_Changed)
    Q_PROPERTY(QList<QString> get_Song_Artists READ get_Song_Artists NOTIFY media_Changed)
    Q_PROPERTY(double get_Song_Duration READ get_Song_Duration NOTIFY media_Changed)
    Q_PROPERTY(double get_Song_Progress READ get_Song_Progress NOTIFY media_Changed)

public:
    explicit now_Playing(QObject *parent = nullptr);

    QString get_Source_Name();
    QString get_Song_Name();
    QString get_Album_Name();
    QString get_Album_Cover_URL();
    QList<QString> get_Song_Artists();
    double get_Song_Duration();
    double get_Song_Progress();
    void update_Data(QJsonObject &new_Data);

signals:
    void media_Changed();

private:
    QJsonObject _now_Playing_Data;
    QString _source_Name = "Spotify";
    QString _song_Name = "Touch Me I'm Going To Scream Part II";
    QString _album_Name = "Evil Urges";
    QString _album_Cover_URL = "http://192.168.1.121:8000/static/now_Playing.jpg";
    QList<QString> _song_Artists = QList<QString>() << QString("My Morning Jacket");
    double _song_Duration = 10000;
    double _song_Progress = 0;
};

#endif // NOW_PLAYING_H
#include "now_playing.h"

now_Playing::now_Playing(QObject *parent) : QObject(parent) {
}

void now_Playing::update_Data(QJsonObject &new_Data) {
    qDebug() << new_Data;
    qDebug() << new_Data["song_Name"].toString();
    _song_Name = new_Data["song_Name"].toString();
}

QString now_Playing::get_Song_Name() {
    return _song_Name;
}
喜欢

_NOW_PLAYING从未初始化。在构造函数中初始化它。

创建一个新的:

IC_Server::IC_Server(QObject *parent) 
    : HttpRequestHandler(parent),
      _NOW_PLAYING(new now_Playing(this))
{}

或共享一个创建的:

IC_Server::IC_Server(now_Playing* nowPlaying, QObject *parent) 
    : HttpRequestHandler(parent),
      _NOW_PLAYING(nowPlaying)
{
    // assign null to _NOW_PLAYING when deleted.
    if (_NOW_PLAYING)
        connect(_NOW_PLAYING, &QObject::destroyed, [&](){_NOW_PLAYING = nullptr;});
}

void IC_Server::service(HttpRequest &request, HttpResponse &response) {
    _http_Data = request.getBody();
    _json_Data = QJsonDocument::fromJson(_http_Data);
    _json_Object = _json_Data.object();

    if (_NOW_PLAYING) // if _NOW_PLAYING is still alive
        _NOW_PLAYING->update_Data(_json_Object);
}

还必须调用信号来通知属性有关更改。

void now_Playing::update_Data(QJsonObject &new_Data) {
    _song_Name = new_Data["song_Name"].toString();
    emit media_Changed();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章