2011-12-15 5 views
3

У меня возникли проблемы с отображением элементов из модели, определенной в C++, в SelectionDialog в qml. Я пытаюсь сделать приложение для операционной системы 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:

#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 как:

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

    modelLanguages.addLanguge(language); 
} 
//(...) 
ctxt->setContextProperty("modelLanguages", &modelLanguages); 

где modelLanguages ​​- это языкМодель.

И я хотел бы, чтобы отобразить список в 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 ​​в качестве модели в ListView, Al элементы отображаются правильно.

может кто-нибудь помочь и сказать мне, что я делаю неправильно здесь, и что мне нужно изменить, чтобы заставить его работать.

Любая помощь приветствуется!

Спасибо!

ответ

4

Хорошо, мне удалось это решить! Я нашел подсказку для soultion здесь, в комментариях: https://qt.gitorious.org/qt-components/qt-components/merge_requests/887#

Мне нужно было добавить свойство count к моей модели, наследующей QAbstractListModel.

Мои LanguageModel.h теперь выглядит примерно так:

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

Я также излучаемый сигнал, когда изменяется количество (при добавлении языки и очистка модели) с:

emit countChanged(m_languages.count()); 

И теперь это работает. :)

Надеюсь, это поможет кому-то.

Прощай!

+0

Просто, чтобы сказать, это правильно работало на симуляторе. Когда я попытался запустить его на реальном устройстве (Nokia N9), я получил пустой список. Вероятно, это связано с тем, что SelectionDialog.qml на устройстве по-прежнему не работает. Чтобы исправить это, я сделал MySelectionDialog.qml с содержимым фиксированного SelectionDialog.qml, которое можно найти здесь: [SelectionDialog.qml] (https://qt.gitorious.org/qt-components/qt-components/blobs /87d135fa275415708be9d30f130ba26d9deb49b7/src/meego/SelectionDialog.qml). – ppalasek