C++ Qt模型阻力与阻力;drop-无法保存类型QJsonValue

C++ Qt模型阻力与阻力;drop-无法保存类型QJsonValue,c++,qt,qdatastream,qt5.9,qmetatype,C++,Qt,Qdatastream,Qt5.9,Qmetatype,我有一个要显示的,带有: 在方法中调用基本实现时,出现以下错误: QVariant::save:无法保存类型“QJsonValue”(类型id:45) QVariant::save中的断言失败:“要保存的类型无效” 所以没问题,就像我添加这些行中描述的那样: // In the header (outside the class) Q_DECLARE_METATYPE(QJsonValue) QDataStream &operator<<(QDataStream &o

我有一个要显示的,带有:

在方法中调用基本实现时,出现以下错误:

QVariant::save:无法保存类型“QJsonValue”(类型id:45)
QVariant::save中的断言失败:“要保存的类型无效”

所以没问题,就像我添加这些行中描述的那样:

// In the header (outside the class)
Q_DECLARE_METATYPE(QJsonValue)
QDataStream &operator<<(QDataStream &out, const QJsonValue &myObj){ /*...*/ }
QDataStream &operator>>(QDataStream &in, QJsonValue &myObj){ /*...*/ }

// In the constructor
qRegisterMetaType<QJsonValue>("QJsonValue");
qRegisterMetaTypeStreamOperators<QJsonValue>("QJsonValue");
//在标题中(类外)
Q_DECLARE_元类型(QJsonValue)
QDataStream和操作符(QDataStream和in,QJsonValue和myObj){/*…*/}
//在构造函数中
qRegisterMetaType(“QJsonValue”);
qRegisterMetaTypeStreamOperators(“QJsonValue”);

但我也有同样的问题,我做错了什么?

我试图重现您的示例,因为我确实无法通过查看您的代码来解释这种行为。我使用Qt 5.5编译了该项目,并且能够重现错误消息:

QVariant::save: unable to save type 'QJsonValue' (type id: 45).
有趣的是,qt5.13中的错误消失了,因为
QVariant
在这个版本中已经包含了QJson类型

似乎,我找到了一种解决此类
缺陷的可能方法,如下所示:

#include <QApplication>
#include <QDebug>
#include <QDataStream>
#include <QJsonDocument>

QDataStream& operator<<(QDataStream& out, const QJsonDocument& myObj) {
    return out;
}

QDataStream& operator >> (QDataStream & in, QJsonDocument& myObj) {
    return in;
}
Q_DECLARE_METATYPE(QJsonDocument)


int main(int argc, char** args) {
    qDebug() << qRegisterMetaTypeStreamOperators<QJsonDocument>();
    QVariant var = QVariant::fromValue(QJsonDocument());
    qDebug() << var.type();
    qDebug() << var.typeName();
    QDataStream stream;
    var.load(stream);   // Workaround: Just call load at least once before any save 
    var.save(stream);
    var.save(stream);
}
#包括
#包括
#包括
#包括
QDataStream和操作员(QDataStream和in、QJsonDocument和myObj){
返回;
}
Q_DECLARE_元类型(QJsonDocument)
int main(int argc,char**args){

qDebug()你的
mimeTypes()怎么样
implemented?@SilvanoCerza我已经更新了感谢您的帮助,您使用的是哪个qt版本?因为我认为在5.13中,QJsonValue已经在qmetatype中定义了,但在5.9中没有,但可能我错了。我同意check@ThibautB.:这是一个很好的观点。我使用的是Qt5.13.0,没有考虑在旧版本中可能发生的情况。在这个如果您可能需要为所有QJson类对象定义所有这些运算符。它们非常多。也许您可以尝试运行我的示例。它应该是自包含的。这不是问题,在5.9源代码中,声明了QJsonValue,我将尝试您的示例哦,对不起,我的最后一个注释是false,在cpp文件中,当它是QJsonValue时,开关返回,但在中,实现不同,仅当指针未分配时才返回false,这解释了它在您的情况下工作的原因。@ThibautB。我更新了我的答案。您可能想看看它。
QVariant::save: unable to save type 'QJsonValue' (type id: 45).
#include <QApplication>
#include <QDebug>
#include <QDataStream>
#include <QJsonDocument>

QDataStream& operator<<(QDataStream& out, const QJsonDocument& myObj) {
    return out;
}

QDataStream& operator >> (QDataStream & in, QJsonDocument& myObj) {
    return in;
}
Q_DECLARE_METATYPE(QJsonDocument)


int main(int argc, char** args) {
    qDebug() << qRegisterMetaTypeStreamOperators<QJsonDocument>();
    QVariant var = QVariant::fromValue(QJsonDocument());
    qDebug() << var.type();
    qDebug() << var.typeName();
    QDataStream stream;
    var.load(stream);   // Workaround: Just call load at least once before any save 
    var.save(stream);
    var.save(stream);
}