用QJsonDocument作为数据源的QAbstractTableModel :: setData子类 - QJsonValue :: setValueAt是私有的

时间:2016-08-05 11:26:08

标签: json qt model

我正在使用标题:

处理子类QAbstractTableModel
#ifndef UEJSONPLACESTABLEMODEL_H
#define UEJSONPLACESTABLEMODEL_H

#include <QAbstractTableModel>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>
#include <QVariant>
#include <QVariantMap>
#include <QVariantList>

class UeJsonPlacesTableModel : public QAbstractTableModel
{
private:
    /**
     * @brief m_ueJsonData
     */
    QJsonDocument m_ueJsonData;

/*protected:*/
public:
    /**
     * @brief ueSetJsonData
     * @param jsonData
     */
    void ueSetJsonData(const QJsonDocument& jsonData);

public:
    /**
     * @brief UeJsonPlacesTableModel
     * @param parent
     */
    UeJsonPlacesTableModel(QObject* parent=Q_NULLPTR);

    /**
     * @brief ueJsonData
     * @return pointer to object representing JSON document
     */
    const QJsonDocument& ueJsonData()
        { return this->m_ueJsonData; }

    /**
     * @brief rowCount
     * @param parent
     * @return number of rows
     */
    int rowCount(const QModelIndex& parent=QModelIndex()) const;

    /**
     * @brief columnCount
     * @param parent
     * @return number of columns
     */
    int columnCount(const QModelIndex& parent=QModelIndex()) const;

    /**
     * @brief data
     * @param index
     * @param role
     * @return data
     */
    QVariant data(const QModelIndex& index,
                  int role=Qt::DisplayRole) const;

    /**
     * @brief headerData
     * @param section
     * @param orientation
     * @param role
     * @return header data
     */
    QVariant headerData(int section,
                        Qt::Orientation orientation,
                        int role=Qt::DisplayRole) const;

    /**
     * @brief flags
     * @param index
     * @return flags for index's cell
     */
    Qt::ItemFlags flags(const QModelIndex& index) const;

    /**
     * @brief setData
     * @param index
     * @param value
     * @param role
     * @return true if succesfull, otherwise false
     */
    bool setData(const QModelIndex& index,
                 const QVariant& value,
                 int role=Qt::EditRole);
};

#endif // UEJSONPLACESTABLEMODEL_H

及其实施:

#include "uejsonplacestablemodel.h"

UeJsonPlacesTableModel::UeJsonPlacesTableModel(QObject* parent)
    : QAbstractTableModel(parent)
{
}   // constructor

int UeJsonPlacesTableModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)

    return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size():0;
}   // rowCount

void UeJsonPlacesTableModel::ueSetJsonData(const QJsonDocument& jsonData)
{
    this->beginResetModel();
    this->m_ueJsonData=jsonData;
    this->endResetModel();
}   // ueSetJsonData

int UeJsonPlacesTableModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent)

    return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().at(0).toObject().keys().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().keys().size():0;
}   // columnCount

QVariant UeJsonPlacesTableModel::data(const QModelIndex& index,
                                      int role) const
{
    if(role!=Qt::DisplayRole||
             index.row()<0||
             index.row()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size():0||
             index.column()<0||
             index.column()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().at(0).toObject().keys().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().keys().size():0)
    {
        return QVariant();
    }    // if

    return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().at(index.row()).toObject().value(this->m_ueJsonData.array().at(index.row()).toObject().keys().at(index.column())).toString():
                                        this->m_ueJsonData.isObject()?this->m_ueJsonData.object().value(this->m_ueJsonData.array().at(index.row()).toObject().keys().at(index.column())).toString():
                                        QVariant();
}   // data

QVariant UeJsonPlacesTableModel::headerData(int section,
                                            Qt::Orientation orientation,
                                            int role) const
{
    if(role!=Qt::DisplayRole||
             section<0||
             section>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size()>0?this->m_ueJsonData.object().size():0:0)
    {
        return QVariant();
    }   // if

    switch(orientation)
    {
        case Qt::Horizontal:
        {
            return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size()>0?this->m_ueJsonData.array().at(0).toObject().keys().at(section):
                                                this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size()>0?this->m_ueJsonData.object().keys().at(section):
                                                QVariant():
                                                QVariant():
                                                QVariant();
        }   // case

        case Qt::Vertical:
        {
            return QAbstractTableModel::headerData(section,
                                                   orientation,
                                                   role);
        }   // case
    }   // switch

    return QVariant();
}   // headerData

Qt::ItemFlags UeJsonPlacesTableModel::flags(const QModelIndex& index) const
{
    return index.column()==0?QAbstractTableModel::flags(index)^Qt::ItemIsEditable:QAbstractTableModel::flags(index);
}   // flags

bool UeJsonPlacesTableModel::setData(const QModelIndex& index,
                                     const QVariant& value,
                                     int role)
{
    if(role!=Qt::EditRole||
             index.row()<0||
             index.row()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size():0||
             index.column()<0||
             index.column()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size()>0?this->m_ueJsonData.object().size():0:0)
    {
        return false;
    }   // if

//    if(this->m_ueJsonData.isArray())
//    {
//        QJsonObject jsonObject=this->m_ueJsonData.array().at(index.row()).toObject();

//        jsonObject.setValueAt()
//    }   // if

    return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().at(index.row()).toObject().setValueAt(this->m_ueJsonData.object().keys().at(index.column()),
                                                                                                         QJsonValue(value.toString()))?true:false:false;
}   // setData

现在,方法setData()

bool UeJsonPlacesTableModel::setData(const QModelIndex& index,
                                     const QVariant& value,
                                     int role)
{
    if(role!=Qt::EditRole||
             index.row()<0||
             index.row()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size():0||
             index.column()<0||
             index.column()>=this->m_ueJsonData.isArray()?this->m_ueJsonData.array().size():this->m_ueJsonData.isObject()?this->m_ueJsonData.object().size()>0?this->m_ueJsonData.object().size():0:0)
    {
        return false;
    }   // if

//    if(this->m_ueJsonData.isArray())
//    {
//        QJsonObject jsonObject=this->m_ueJsonData.array().at(index.row()).toObject();

//        jsonObject.setValueAt()
//    }   // if

    return this->m_ueJsonData.isArray()?this->m_ueJsonData.array().at(index.row()).toObject().setValueAt(this->m_ueJsonData.object().keys().at(index.column()),
                                                                                                         QJsonValue(value.toString()))?true:false:false;
}   // setData

我正在尝试更改QJsonObject的值,但QJsonObject::setValueAt()被声明为私有,因此我无法使用它。是否还有其他选项可以更改QJsonDocument中的某些值?

1 个答案:

答案 0 :(得分:1)

另一种选择,您可以使用:QVariantQVariantMapQVariantListQVariantMap示例:

QJsonDocument jsonDoc = QJsonDocument::fromJson(inputData.toUtf8());
QVariantMap map = jsonDoc.toVariant().toMap();
// Modify values
int value = map["example"].toInt();
map["example"] = value++;
qDebug() << "Current Value  " << map["example"].toInt();

至少,你可以使用你的jsondoc:

jsondoc = QJsonDocument::fromVariant(map);
// Notify that the data changed.
emit dataChanged(QModelIndex(), QModelIndex());

编辑[QVariantMap Iterator] 如何迭代QVariantMap

如果要打印所有可用字段和当前值:

for(QVariantMap::const_iterator iter = datamap.begin(); iter != datamap.end(); ++iter) {
     qDebug() << "Keys Are: " << iter.key() << "Values Are: " << iter.value();
      stuff = iter.value();
}

如果您将它用于模型,则可以使用QModelIndex的row()o column()值:

const int row = index.row();
QVariantMap::iterator iter = map.begin();
iter = iter + row; //Current data position
iter.value = "New Valuee"; // Modify the value
// Now reload your jsondoc of the model
jsondoc = QJsonDocument::fromVariant(map);
// Notify that the data changed.
emit dataChanged(QModelIndex(), QModelIndex());