Russian Qt Forum
Ноябрь 01, 2024, 12:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация всех моделей С++ для QML в одном классе  (Прочитано 5307 раз)
amateur.cpp
Гость
« : Август 08, 2013, 10:53 »

Можно ли как-то реализовать класс на С++, что бы он являлся как бы менеджером всех моделей, которые потом используем в QML? Такую себе фабрику моделей. Что бы не писать постоянно декларацию контекстных свойств в main для каждой модели и не использовать в коде QML условий, а возвращать модели по каким-то признакам и данным из этого менеджера(фабрики). Мне например пригодилась бы возможность возвращать модели по индексу.
Спасибо!
Записан
mutineer
Гость
« Ответ #1 : Август 08, 2013, 10:54 »

Сделай объект, который выставь в QML. А у этого объекта сделай метод, который возвращает модель. И вызывай этот метод из QML
Записан
amateur.cpp
Гость
« Ответ #2 : Август 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
}
 
Записан
mutineer
Гость
« Ответ #3 : Август 08, 2013, 12:14 »

Код
C++ (Qt)
Model *model = new Model();
viewer.rootContext()->setContextProperty ("Model", model);
 
Этого кода не надо

Возвращать метод должен QObject*, а не Model*
Записан
amateur.cpp
Гость
« Ответ #4 : Август 08, 2013, 13:54 »

Код
C++ (Qt)
Model *model = new Model();
viewer.rootContext()->setContextProperty ("Model", model);
 
Этого кода не надо

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

Спасибо, все получилось! А как Вы думаете это хорошая идея вообще использовать такой один класс на все модели?
Записан
mutineer
Гость
« Ответ #5 : Август 08, 2013, 14:11 »

ага, можно их создавать по необходимости, например
Записан
OKTA
Гость
« Ответ #6 : Август 08, 2013, 14:21 »

наследственность это всегда хорошо)
Записан
amateur.cpp
Гость
« Ответ #7 : Август 08, 2013, 14:27 »

наследственность это всегда хорошо)

Извините, не понял Грустный При чем здесь наследственность?
Записан
amateur.cpp
Гость
« Ответ #8 : Август 08, 2013, 14:34 »

А что у Вас, вернее уже у нас, на форуме нет плюсиков разных или спасибо сказать?
Записан
mutineer
Гость
« Ответ #9 : Август 08, 2013, 15:01 »

nope, кармы тут не водится
Записан
amateur.cpp
Гость
« Ответ #10 : Август 08, 2013, 17:00 »

nope, кармы тут не водится

Тогда еще раз спасибо, тема закрыта!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.221 секунд. Запросов: 21.