代码可以编译,但是当我尝试为now_Playing类的update_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] 删除。
我来说两句