将SelectionDialog模型设置为继承QAbstractListModel的模型;没有项目显示



我在qml中的SelectionDialog中显示c++中定义的模型中的项目时遇到了麻烦。我正在尝试为Meego操作系统做一个应用程序。

如果我在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);

,modelllanguages是一个语言模型。

我想在Settings.qml:

中显示列表
//(...)
SelectionDialog {
    id: dialogLanguages
    titleText: qsTr("Select language")
    model: modelLanguages
    delegate: Text  { text: name}
}

当我打开dialogLanguages时,我只能看到标题"Select language",而看不到模型中的任何项。

如果我用这个作为模型,它工作得很好:

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

同样,正如我已经提到的,如果我将modelelllanguages设置为ListView中的一个模型,那么所有的项目都会正确显示。

有没有人可以帮助我,告诉我我在这里做错了什么,我需要改变什么才能使它工作。

任何帮助都是感激的!

谢谢!

好了,我解决了!我在评论中找到了解决方案的提示:https://qt.gitorious.org/qt-components/qt-components/merge_requests/887#

我需要向继承QAbstractListModel的模型添加一个计数属性。

My languagmodel .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());

现在它起作用了。:)

我希望这能帮助到别人。

再见!

相关内容

  • 没有找到相关文章

最新更新