2016-08-05 5 views
0

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?

Antwort

1

Eine Alternative könnten Sie verwenden: QVariant, QVariantMap oder QVariantList, ein Beispiel mit 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(); 

Zumindest könnten Sie Ihre jsondoc ubpate:

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

bearbeiten [QVariantMap Iterator ] Wie iteriert man in einem QVariantMap?

Wenn Sie wollen, dass alle verfügbare Felder drucken und den aktuellen Wert:

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

Wenn Sie es für Ihr Modell verwenden, können Sie die Zeile() o Spalte() Wert eines QModelIndex verwenden:

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

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

+1

Ich habe eine Zeile hinzugefügt, die erklärt, wie man zu einer QVariantMap iteriert – mohabouje

Verwandte Themen