【发布时间】: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 中的某些值?
【问题讨论】: