我正在使用标题:
处理子类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
中的某些值?
答案 0 :(得分:1)
另一种选择,您可以使用:QVariant,QVariantMap或QVariantList,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());