Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
29 августа 2018 г. 8:32

Использование модели из слоя QT в слое QML


Раннее использовал модель через контекст


int main(int argc, char *argv[])
{

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);


    Sp_fileModel model_file;

    QQmlApplicationEngine engine;

    AppCore appCore;

    appCore.setSp_fileModel(&model_file);

    QQmlContext *context=engine.rootContext();

    context->setContextProperty("appCore", &appCore);

    context->setContextProperty("myModel_file", &model_file);


    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}

Сейчас разбираю пример с использованием конструкции qmlRegisterType

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
// register the type DataEntryModel
// under the url "org.example" in version 1.0
// under the name "DataEntryModel"
qmlRegisterType<DataEntryModel>("org.example", 1, 0, "DataEntryModel");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}


В чем преимущества и недостатки того и другого варианта?
3

В случае с регистрацией через контекст, вы получаете объект этой модели, которая по сути будет доступна во всём приложении в QML слое по тому имени, с которым вы зарегистрировали её.

Напоминает синглетон, хотя для QML синглетон делается иначе, но в том плане, что это один объект на всё приложение получается, слегка его напоминает.
Минус в том, что объект всегда висит в памяти, плюс в том, что он всегда доступен отовсюду в QML.
Если использовать qmlRegisterType, то вы можете создавать локальные объекты а QML файлах, которые при окончании их использования будут собираться сборщиком мусора QML.
Плюс в том, что вы например можете написать достаточно универсальную модель данных, которую будете использовать для несколько таблиц из базы данных в разных "страничках" в Stacked View, например.
Также qmlRegisterType нужно использовать в том случае, если вы динамически создаёте и уничтожаете объекты в QML, иногда проще зарегистрировать класс как тип QML и работать с ним только в QML, поскольку он не будет требоваться для бизнес-логики в C++. Это может быть например какая-то хитрая кнопка или древовидный список, который был написан на C++ в качестве наследника от QQuickItem.






0

Спасибо. Коротко и доходчиво. А что такое синглетон? - несколько раз читал - так до конца и не уяснил..

0

Фактически синглетон, в моём понимании, - это объект который существует в программе исключительно в одном экземпляре. Всегда в одном экземпляре.

Достигается это либо соглашением разработчиков внутри проекта о использовании глобального объекта. Думаю, что такое может часто использоваться при разработке на Си, либо применением особенностей языка программирования, чтобы исключить человеческий фактор.
Классическим примером является синглетон мейерса, вот пример из википедии
class OnlyOne
{
public:
        static OnlyOne& Instance()
        {
                static OnlyOne theSingleInstance;
                return theSingleInstance;
        }
private:        
        OnlyOne(){};
        OnlyOne(const OnlyOne& root) = delete;
        OnlyOne& operator=(const OnlyOne&) = delete;
};

В данном случае синглетон является потокобезопасным и без блокировок.
Во-первых здесь запрещено копирование, присваивание и создание класса кноструктором по умолчанию где-либо вне самого класса и его статических методов.
Поэтому создать этот объект без изменения кода класса не получится и теоретически такие изменения без веской причины не должны проходить код-ревью, поэтому можно отловить человеческий фактор на этапе ревью.
Во-вторых имеется статический метод, который возвращает ссылку на инстанс объекта, а сам объект является статическим внутри этого статического метода, что гарантирует, что объект будет создан один раз при первом вызове этого статического метода. Объект будет существовать всё время жизни программы внутри локальной памяти статического метода класса.




0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
IO
20 января 2019 г. 18:39
Ivan Otreshko

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
IO
20 января 2019 г. 15:27
Ivan Otreshko

C++ - Тест 003. Условия и циклы

  • Результат:0баллов,
  • Очки рейтинга-10
v
17 января 2019 г. 11:51
vitalir12

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
I
16 января 2019 г. 8:06
IscanderChe

Заработало. Забыл model->select(); вписать.
I
16 января 2019 г. 8:02
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
16 января 2019 г. 7:51
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
16 января 2019 г. 7:43
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Сейчас обсуждают на форуме
21 января 2019 г. 16:28
Михаиллл

Добрый день.Почему работая на С++, нельзя полноценно использовать dll , написанных на C#, java?И почему используя другие языки, можно использовать dll , написанных на C++?
21 января 2019 г. 16:24
Михаиллл

Нашел ссылку на древние типы данных , а тут нынешние их аналоги.Но все равно каое что непоня:что такое : LPCTSTR, CALLBACK (наверно QDialig),IDOK, EDITSTREAM, TCHARКод...
21 января 2019 г. 14:30
Евгений Легоцкой

Порядок создания тем - пункт 4
ПБ
21 января 2019 г. 9:23
Павел Богдевич

Ребята, привет. Это 2 версии одного приложения. Отличаются только способом инициализации таблицы. В одной версии работает сортировка таблицы, когда кликаешь по хедеру колонки, в другой - нет. ...
21 января 2019 г. 7:36
Евгений Легоцкой

Добрый день! Из ваего вопроса понятна первая часть. На сайте есть статья по динамическому созданию виджетов, посмотрите её для начала - Динамическое создание виджетов . ...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы