c++ - 内部类变量中的读取访问冲突
问题描述
代码可以编译,但是当我尝试在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();
}
推荐阅读
- java - 运行所述 .bat 文件时,.bat 文件中的内容无法正常运行
- omnet++ - 在 Omnet++ 和 Inet 中,如何将无线主机配置为被动监控模式?
- ruby - 我无法使用 RUBY 和 RSPEC 返回 api 的主体
- php - WordPress 中的多个下拉选择
- python - “write() 参数必须是 str,而不是字节”
- reactjs - TypeError:未定义不是对象(评估“movies.map”)
- amazon-web-services - 从 S3 托管的网站访问 Lambda 函数时出现 CORS 错误
- c++ - 为什么我分配对象本身不能正常工作?
- flutter - 一个关于 Flutter 响应性的快速问题
- reactjs - React api 调用的 Windows 身份验证