Ich arbeite an subclassed QAbstractTableModel mit Kopf:Unterklasse QAbstractTableModel :: setData mit QJsonDocument als Datenquelle - QJsonValue :: setValueAt privat
#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
und seine Umsetzung:
#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
nun in Methode 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
Ich versuche, den Wert von 01 zu ändern, aber QJsonObject::setValueAt()
wird als privat deklariert, daher kann ich es nicht verwenden. Gibt es andere Möglichkeiten, einen Wert in QJsonDocument
zu ändern?
dies eine Lösung ist jedoch, wie konvertiere ich 'index.column() "nützlich", um Parameter für' map [] 'da zum Beispiel, habe ich' QVariantList': 'dataList.at (index.row()). toMap() [index.column()] = value.toString(); 'funktioniert nicht! – KernelPanic
Ich habe eine Zeile hinzugefügt, die erklärt, wie man zu einer QVariantMap iteriert – mohabouje