Russian Qt Forum

Qt => Qt Quick => Тема начата: amateur.cpp от Август 08, 2013, 10:53



Название: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 10:53
Можно ли как-то реализовать класс на С++, что бы он являлся как бы менеджером всех моделей, которые потом используем в QML? Такую себе фабрику моделей. Что бы не писать постоянно декларацию контекстных свойств в main для каждой модели и не использовать в коде QML условий, а возвращать модели по каким-то признакам и данным из этого менеджера(фабрики). Мне например пригодилась бы возможность возвращать модели по индексу.
Спасибо!


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: mutineer от Август 08, 2013, 10:54
Сделай объект, который выставь в QML. А у этого объекта сделай метод, который возвращает модель. И вызывай этот метод из QML


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 12:06
Сделай объект, который выставь в QML. А у этого объекта сделай метод, который возвращает модель. И вызывай этот метод из QML

У Вас нет готового примера, что бы работал в Qt 5?
Я примерно так делал, ничего не получается. Даже просто возвратить модель из какого-то класса не получается :(
Код
C++ (Qt)
/*  */
class Model : public QAbstractListModel
{    
   Q_OBJECT
 
public:
   explicit Model(QObject *parent = 0);
 
   int rowCount (const QModelIndex &parent) const;
   QVariant data(const QModelIndex &index, int role) const;
 
private:
 
};
 
/*  */
class Models : public QObject
{
   Q_OBJECT
public:
   explicit Models(QtQuick2ApplicationViewer *viewer, QObject *parent = 0);
   Q_PROPERTY(Model *model READ getModel NOTIFY modelChanged);        
 
   Model *getModel();
 
signals:
   void modelChanged();
 
public slots:
 
private:
 
   Model *model_;
 
};
 

Декларируем контекстные свойства в QML в файле main.cpp.
Код
C++ (Qt)
Models *models = new Models(&viewer);
viewer.rootContext()->setContextProperty ("Models", models);
Model *model = new Model();
viewer.rootContext()->setContextProperty ("Model", model);
 

Используем в QML
Код
Javascript
ListView {
       id: view
       width: parent.width
       model: Models.model
}
 


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: mutineer от Август 08, 2013, 12:14
Код
C++ (Qt)
Model *model = new Model();
viewer.rootContext()->setContextProperty ("Model", model);
 
Этого кода не надо

Возвращать метод должен QObject*, а не Model*


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 13:54
Код
C++ (Qt)
Model *model = new Model();
viewer.rootContext()->setContextProperty ("Model", model);
 
Этого кода не надо

Возвращать метод должен QObject*, а не Model*

Спасибо, все получилось! А как Вы думаете это хорошая идея вообще использовать такой один класс на все модели?


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: mutineer от Август 08, 2013, 14:11
ага, можно их создавать по необходимости, например


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: OKTA от Август 08, 2013, 14:21
наследственность это всегда хорошо)


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 14:27
наследственность это всегда хорошо)

Извините, не понял :( При чем здесь наследственность?


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 14:34
А что у Вас, вернее уже у нас, на форуме нет плюсиков разных или спасибо сказать?


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: mutineer от Август 08, 2013, 15:01
nope, кармы тут не водится


Название: Re: Реализация всех моделей С++ для QML в одном классе
Отправлено: amateur.cpp от Август 08, 2013, 17:00
nope, кармы тут не водится

Тогда еще раз спасибо, тема закрыта!