2011-12-15 26 views
3

qmlのSelectionDialogでC++で定義されたモデルの項目を表示するのに問題があります。私はMeegoオペレーティングシステム用のアプリケーションを作成しようとしています。SelectionDialogモデルをQAbstractListModelを継承するモデルに設定します。表示されている項目がありません

アイテムをListViewに表示すると、すべて正常に動作し、アイテムが表示されます。しかし、私がSelectionDialogでそれらを表示しようとすると、私は空のリストを取得します。ここで

いくつかのコードです:

languagemodel.h:

#ifndef LANGUAGEMODEL_H 
#define LANGUAGEMODEL_H 

#include <baza/language.h> 
#include <QObject> 
#include <QAbstractListModel> 

class LanguageModel: public QAbstractListModel 
{ 
    Q_OBJECT 
public: 
    enum LanguageRoles { 
     RoleLanguageName = Qt::DisplayRole, 
     RoleLanguageCode = Qt::UserRole, 
     RoleId = Qt::UserRole+1, 
     RoleChosen = Qt::UserRole+2 
    }; 

    LanguageModel(QObject *parent = 0); 

    void addLanguge(const Language &language); 
    void clear(); 

    int rowCount(const QModelIndex & parent = QModelIndex()) const; 

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; 

private: 
    QList<Language> m_languages; 
}; 

#endif // LANGUAGEMODEL_H 

がlanguagemodel.cpp:

//(...) 
for(unsigned int i = 0; i < listLanguages.size(); i++) 
{ 
    Language language = listLanguages.at(i); 

    modelLanguages.addLanguge(language); 
} 
//(...) 
ctxt->setContextProperty("modelLanguages", &modelLanguages); 
:ようhandler.cppから行うに言語を追加

#include "languagemodel.h" 
#include <QDebug> 

LanguageModel::LanguageModel(QObject *parent) 
    : QAbstractListModel(parent) 
{ 
    QHash<int, QByteArray> roles; 

    roles[RoleLanguageName]="name"; 
    roles[RoleLanguageCode]="code"; 
    roles[RoleId]="id"; 
    roles[RoleChosen]="chosen"; 

    setRoleNames(roles); 
} 

void LanguageModel::addLanguge(const Language &language){ 
    beginInsertRows(QModelIndex(), rowCount(), rowCount()); 
    m_languages << language; 
    endInsertRows(); 
} 

int LanguageModel::rowCount(const QModelIndex & parent) const { 
    return m_languages.count(); 
} 

void LanguageModel::clear(){ 
    for (int i=0; i<m_languages.count(); i++) 
    { 
     beginRemoveRows(QModelIndex(), 0, 0); 
     m_languages.removeAt(0); 
     endRemoveRows(); 
    } 
} 

QVariant LanguageModel::data(const QModelIndex & index, int role) const { 
    if (index.row() < 0 || index.row() > m_languages.count()) 
     return QVariant(); 

    const Language &language = m_languages[index.row()]; 
    if (role == RoleLanguageName) 
     return language.getName(); 
    else if (role == RoleLanguageCode) 
     return language.getCode(); 
    else if (role == RoleChosen) 
     return language.isChosen(); 
    else if (role == RoleId) 
     return language.getId(); 

    return QVariant(); 
} 

whe再 modelLanguagesはLanguageModelです。

そして、私はSettings.qmlでリストを表示したいと思います:

//(...) 
SelectionDialog { 
    id: dialogLanguages 

    titleText: qsTr("Select language") 
    model: modelLanguages 
    delegate: Text { text: name} 
} 

私はdialogLanguagesを開くと、私は唯一のモデルからの項目のいずれかなしにタイトル「言語選択」を参照してくださいすることができます。私はモデルとしてこれを使用する場合

は、それが正常に動作します:

model: ListModel { 
    ListElement { name: "ListElement #1" } 
    ListElement { name: "ListElement #2" } 
    ListElement { name: "ListElement #3" } 
} 

をまた、私はすでに述べたように、私は、リストビューでモデルとしてmodelLanguagesを設定した場合、アル項目が正しく表示されます。

誰でも助けてくれて、私はここで間違っていると私はそれを働かせるために何を変えなければならないのか教えてください。

ご協力いただきましてありがとうございます。

ありがとうございました!

答えて

4

いいえ、私はそれを解決することができました!私はここでコメントのヒントを見つけました:https://qt.gitorious.org/qt-components/qt-components/merge_requests/887#

QAbstractListModelを継承するモデルにcountプロパティを追加する必要がありました。

class LanguageModel: public QAbstractListModel 
{ 
    Q_OBJECT 

    Q_PROPERTY(int count READ count NOTIFY countChanged) 

    //(...) 
public: 
    //(...) 
    int count(); 
    //(...) 
signals: 
    void countChanged(int newCount); 
    //(...) 

私はLanguageModel.cppで必要なメソッドを追加しました::

//(...) 
int LanguageModel::count(){ 
    return m_languages.count(); 
} 
//(...) 

私も信号を放射されたが、カウントの変更(追加

私LanguageModel.hは今、次のようになります言語をクリアし、モデルをクリアする):

emit countChanged(m_languages.count()); 

これで機能しています。 :)

私はこれが誰かを助けてくれることを願っています。

Bye!

+0

これはちょっと言えば、これはシミュレータで正しく機能しました。私は実際のデバイス(Nokia N9)でそれを実行しようとしたとき、私は空のリストを持っています。これは、デバイスのSelectionDialog.qmlがまだバグのためです。これを修正するために、私はここで見つけることができます固定SelectionDialog.qmlの内容でMySelectionDialog.qmlを作った:[SelectionDialog.qml](https://qt.gitorious.org/qt-components/qt-components/blobs /87d135fa275415708be9d30f130ba26d9deb49b7/src/meego/SelectionDialog.qml)。 – ppalasek

関連する問題