2011-12-15 1 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); 
:

#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(); 
} 

같은 handler.cpp에서 수행에 언어를 추가

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" } 
} 

을 또한, 이미 언급 한 것처럼, 내가있는 ListView에서 모델로 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()); 

이제 작동합니다. :)

나는 이것이 누군가를 돕기를 바랍니다.

안녕!

+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