【问题标题】:Subclassed QAbstractTableModel::setData with QJsonDocument as data source - QJsonValue::setValueAt is private以 QJsonDocument 作为数据源的子类 QAbstractTableModel::setData - QJsonValue::setValueAt 是私有的
【发布时间】:2016-08-05 11:26:08
【问题描述】:

我正在处理带有标题的子类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

现在,在方法@​​987654324@:

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 中的某些值?

【问题讨论】:

    标签: json qt model


    【解决方案1】:

    另一种选择,您可以使用:QVariantQVariantMapQVariantList,以 QVariantMap 为例:

    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());
    

    【讨论】:

    • 这是一个解决方案,但是,我如何转换index.column() to parameter "useful" for map[]`,因为例如我使用了QVariantListdataList.at(index.row()).toMap()[index.column()]=value.toString(); 不起作用!
    • 我添加了一些解释如何迭代到 QVariantMap 的行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多