gpt4 book ai didi

c++ - Qt 模型拖放 - 无法保存类型 QJsonValue

转载 作者:行者123 更新时间:2023-11-30 04:45:47 26 4
gpt4 key购买 nike

我有一个 QAbstractListModel显示 QJsonArray , 与 drag & drop implementation :

class NoteListModel : public QAbstractListModel
{
Q_OBJECT

public:
explicit NoteListModel(QObject *parent = nullptr);
~NoteListModel() override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
// Drag & Drop:
bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override;
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
QStringList mimeTypes() const override {
QStringList mimes = QAbstractListModel::mimeTypes();
mimes.prepend("application/flynote_json");
return mimes;
}
QMimeData *mimeData(const QModelIndexList &indexes) const override;
Qt::DropActions supportedDropActions() const override;

private:
QJsonArray noteArray;

};

当我在 mimeData() 中调用基础实现时方法,我有这个错误:

QVariant::save: unable to save type 'QJsonValue' (type id: 45)
ASSERT failure in QVariant::save: "Invalid type to save"

QMimeData *NoteListModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *ret = nullptr;
if (indexes.size() == 1){
QModelIndex mi = indexes.first();
if (mi.isValid()){
ret = QAbstractListModel::mimeData(indexes);
QJsonDocument json_mime(noteArray.at(mi.row()).toObject());
ret->setData("application/flynote_json", json_mime.toJson());
}
}
return ret;
}

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

// 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");

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

最佳答案

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

QVariant::save: unable to save type 'QJsonValue' (type id: 45).

有趣的是,该错误在 Qt 5.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);
}

如果在所有 save 调用之前至少调用一次 load,错误就会消失。至少对于 Qt 5.5。

不幸的是,我手头没有 Qt 5.5 的源代码来真正找到这种奇怪行为的原因。我也不知道是什么让 QJsonDocument 在其他不需要调用 load 的类中如此特别。

关于c++ - Qt 模型拖放 - 无法保存类型 QJsonValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com