【发布时间】:2019-11-26 11:49:41
【问题描述】:
我有一个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: 无法保存类型“QJsonValue”(类型 ID:45)
QVariant::save 中的 ASSERT 失败:“要保存的类型无效”
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");
但我有同样的问题,我做错了什么?
【问题讨论】:
-
你的
mimeTypes()是如何实现的? -
@SilvanoCerza 我已经更新了
标签: c++ qt qdatastream qt5.9 qmetatype