Здравствуйте.
Если определить модель внутри qml файла:
PathView {
id: view
width: parent.width
height: parent.height + y
y: -33
model: ListModel{
ListElement{
name: "7even"
}
.....
}
delegate: Rectangle{
width: 72
height: 72
scale: 2. * y / parent.height
z: y
smooth: true
opacity: scale
Image{
source: "../../icons/"+name+"/32.png"
width: 48
height: 48
anchors.top: parent.top
anchors.left: parent.left
smooth: true
}
}
focus: true
}
Text {
id: label
text: view.model.get(view.currentIndex).name
color: "black"
font.pixelSize: 16
font.bold: true
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: 24
}
}
то при выборе элементов в списке, label отображает значения.
Но существует необходимость загрузки модели из c++ программы.
изменим model=iconsThem
Созданим класс ThemeIcon и ThemeIconModel
C++ (Qt)
#ifndef THEMEICONMODEL_H
#define THEMEICONMODEL_H
#include <QAbstractListModel>
class ThemeIcon
{
public:
ThemeIcon(const QString &name);
QString name() const;
private:
QString fname;
};
class ThemeIconModel : public QAbstractListModel
{
Q_OBJECT
public:
enum ThemeIconRoles {
NameRole=Qt::UserRole+1
};
ThemeIconModel(QObject *parent = 0);
void addThemeIcon(const ThemeIcon &themeIcon);
int rowCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
private:
QList<ThemeIcon> fThemeIcons;
};
#endif // THEMEICONMODEL_H
C++ (Qt)
#include "themeiconmodel.h"
ThemeIcon::ThemeIcon(const QString &name):fname(name)
{
}
QString ThemeIcon::name() const
{
return fname;
}
ThemeIconModel::ThemeIconModel(QObject *parent) :
QAbstractListModel(parent)
{
QHash<int,QByteArray> roles;
roles[NameRole]="name";
setRoleNames(roles);
}
void ThemeIconModel::addThemeIcon(const ThemeIcon &themeIcon)
{
beginInsertRows(QModelIndex(),rowCount(),rowCount());
fThemeIcons<<themeIcon;
endInsertRows();
}
int ThemeIconModel::rowCount(const QModelIndex &parent) const
{
return fThemeIcons.count();
}
QVariant ThemeIconModel::data(const QModelIndex &index, int role) const
{
if (index.row()<0 || index.row()>fThemeIcons.count())
return QVariant();
const ThemeIcon &themeIcon=fThemeIcons[index.row()];
if (role==NameRole) return themeIcon.name();
}
Далее в программе выполняем следующее
C++ (Qt)
ThemeIconModel themeIcon;
themeIcon.addThemeIcon(ThemeIcon("7even"));
themeIcon.addThemeIcon(ThemeIcon("Droplets"));
themeIcon.addThemeIcon(ThemeIcon("Glossy"));
themeIcon.addThemeIcon(ThemeIcon("Stellar"));
themeIcon.addThemeIcon(ThemeIcon("tick_blue"));
QDeclarativeView *view=new QDeclarativeView();
view->rootContext()->setContextProperty("iconsThem",&themeIcon );
view->setSource(QUrl("main.qml"));
view->show();
Иконки модель отображает, также, после запуска в label отображается текст, соответствующий нулевому элементу модели.
Но в консоль выдается сообщение TypeError: Result of expression 'view.model.get' [undefined] is not a function.
Как корректно получить данные из модели при передаче ее из внешней программы?
В принципе в ошибке все описано :) нет такой ф-ции get() почитай вот эти статьи
http://doc.qt.nokia.com/4.7-snapshot/qdeclarativemodels.html
http://www.prog.org.ru/topic_11999_0.html
особенно обрати внимание на Q_PROPERY и Q_INVOKABLE (если нужна функция)
плюс я не вижу декларации твоей модели в качестве плагина, не знаю обязательно ли это, но я постоянно ее декларирую.
В принципе в ошибке все описано :) нет такой ф-ции get() почитай вот эти статьи
http://doc.qt.nokia.com/4.7-snapshot/qdeclarativemodels.html
http://www.prog.org.ru/topic_11999_0.html
особенно обрати внимание на Q_PROPERY и Q_INVOKABLE (если нужна функция)
плюс я не вижу декларации твоей модели в качестве плагина, не знаю обязательно ли это, но я постоянно ее декларирую.
Q_INVOKABLE помог.
Определил метод data как
C++ (Qt)
Q_INVOKABLE QVariant data(int index) const;
со следующей реализацией
C++ (Qt)
QVariant ThemeIconModel::data(int index) const
{
return fThemeIcons[index].name();
}
И далее в qml
text: view.model.data(view.currentIndex)