0

ListViewを作成しました。これをカスタムDataModelとしたいと思います。しかし、問題があります。ビューが作成される瞬間に、モデルにデータがロードされません。モデルデータは、ビューが作成された後に設定され、モデルにデータを設定すると、ビューは更新されず、モデルデータを再度読み取ることもありません。これは私のListViewです:ListViewにDataModelが変更されたことを通知する方法

ListViewCountainer.qml

Container { 
    // countryModelData is set after ListViewCountainer gets created 
    // when countryModelData gets set, the model is populated with data 
    property variant countryModelData 

    leftPadding: 20.0 
    rightPadding: 20.0 
    topPadding: 20.0 
    bottomPadding: 20.0 

    CountryDetailsListView { 
     id: countryDetailsListView 

     dataModel: CountryDataModel { 
      countryData: countryModelData 
     } 
    } 
} 

そして、ここでは私のモデルである:

countrydatamodel.h

#ifndef COUNTRYDATAMODEL_H_ 
#define COUNTRYDATAMODEL_H_ 

#include <QtCore/QAbstractListModel> 
#include <QtCore/QList> 
#include <QObject> 
#include <QtCore/QVariant> 

#include <bb/cascades/DataModel> 
#include <bb/data/JsonDataAccess> 

class CountryDataModel : public bb::cascades::DataModel 
{ 
    Q_OBJECT 

    Q_PROPERTY(QVariant countryData READ getCountryData WRITE setCountryData) 

public: 
    CountryDataModel(QObject* parent = 0); 
    virtual ~CountryDataModel(); 

    Q_INVOKABLE int childCount(const QVariantList& indexPath); 
    Q_INVOKABLE QVariant data(const QVariantList& indexPath); 
    Q_INVOKABLE bool hasChildren(const QVariantList& indexPath); 
    Q_INVOKABLE QString itemType(const QVariantList& indexPath); 
    Q_INVOKABLE void removeItem(const QVariantList& indexPath); 

    Q_INVOKABLE QVariant getCountryData(); 
    Q_INVOKABLE void setCountryData(QVariant data); 

private: 
    QVariantList m_elements; 
}; 

#endif /* COUNTRYDATAMODEL_H_ */ 

countrydatamodel.cpp

#include <src/countrydatamodel.h> 

#include <QtCore/QtAlgorithms> 
#include <QtCore/QDebug> 

#include <bb/cascades/DataModel> 
#include <bb/data/JsonDataAccess> 

CountryDataModel::CountryDataModel(QObject* parent) : bb::cascades::DataModel(parent) 
{ 
} 

CountryDataModel::~CountryDataModel() 
{ 
} 

bool CountryDataModel::hasChildren(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::hasChildren" << indexPath; 

    if ((indexPath.size() == 0)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

int CountryDataModel::childCount(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::childCount" << indexPath; 

    if (indexPath.size() == 0) 
    { 
     qDebug() << "CountryDataModel::childCount" << m_elements.size(); 

     return m_elements.size(); 
    } 

    qDebug() << "==== CountryDataModel::childCount" << 0; 

    return 0; 
} 

QVariant CountryDataModel::data(const QVariantList &indexPath) 
{ 
    qDebug() << "==== CountryDataModel::data" << indexPath; 

    if (indexPath.size() == 1) { 

     return m_elements.at(indexPath.at(0).toInt()); 
    } 

    QVariant v; 
    return v; 
} 

QString CountryDataModel::itemType(const QVariantList &indexPath) 
{ 
    Q_UNUSED(indexPath); 

    return ""; 
} 

void CountryDataModel::removeItem(const QVariantList& indexPath) 
{ 
    if(indexPath.size() == 1) { 
     m_elements.removeAt(indexPath.at(0).toInt()); 
    } 

    emit itemRemoved(indexPath); 
} 

QVariant CountryDataModel::getCountryData() 
{ 
    return QVariant(m_elements); 
} 

void CountryDataModel::setCountryData(QVariant data) 
{ 
    m_elements = data.toList(); 

    qDebug() << "================== CountryDataModel: " << m_elements; 
} 

私は、モデルが作成されたときListViewは、一度だけデータのためのモデルを要求することを意味し、例えばchildCount機能でいくつかのデバッグメッセージを入れて、それが一度だけ呼び出されます。

ListViewは、データがモデル化された後にモデルからデータを再度読み取ることはできますか?または、このアプローチを有効にしてビューにデータをロードするにはどうすればよいですか?

ありがとうございます!更新するモデルのためには、setCountryDataメンバ関数はそうのように更新する必要がある

答えて

1

void CountryDataModel::setCountryData(QVariant data) 
{ 
    m_elements = data.toList(); 

    emit itemsChanged(bb::cascades::DataModelChangeType::AddRemove, QSharedPointer<bb::cascades::DataModel::IndexMapper>(0)); 
} 

FML ...

-2

あなたがしたいプロパティの信号を宣言する必要がありますバックエンドで更新する。

Q_PROPERTY(QVariant countryData READ getCountryData WRITE setCountryData NOTIFY contryDataChanged) 

その宣言も同様に追加します。

は次にあなたが言う - あなたはリストのように感じるところはどこでも

emit contryDataChanged(); 

が内容を再読み込みする必要があります。 (通常はセッターメソッド)。

+0

countryDataプロパティを作成し、通知信号を出すことはビューとは関係ありません。 –

関連する問題