Russian Qt Forum

Qt => Qt Quick => Тема начата: nixman05 от Август 22, 2011, 18:27



Название: QML и модели из C++ (model.get в модели переданой в qml из С++ возвращает ошибку
Отправлено: nixman05 от Август 22, 2011, 18:27
Здравствуйте.

Если определить модель внутри 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.

Как корректно получить данные из модели при передаче ее из внешней программы?


Название: Re: QML и модели из C++ (model.get в модели переданой в qml из С++ возвращает ошибку
Отправлено: ecspertiza от Август 22, 2011, 23:23
В принципе в ошибке все описано  :) нет такой ф-ции get() почитай вот эти статьи

http://doc.qt.nokia.com/4.7-snapshot/qdeclarativemodels.html
http://www.prog.org.ru/topic_11999_0.html

особенно обрати внимание на Q_PROPERY и Q_INVOKABLE (если нужна функция)

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


Название: Re: QML и модели из C++ (model.get в модели переданой в qml из С++ возвращает ошибку
Отправлено: nixman05 от Август 23, 2011, 23:39
В принципе в ошибке все описано  :) нет такой ф-ции 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)