crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как правильно отделить QML от бэкенда на Си++
iDarkLord
  опции профиля:
сообщение 20.10.2014, 14:32
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 20.10.2014
Пользователь №: 4255

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сабж. Ключево слово правильно, а не абы как что б работало.
Я так понял простой способ заключается в том, что бы по QML свойству: objectName получить объект и установить у него нужное свойство. Как то так:
     QQmlEngine engine;
     engine.rootContext()->setContextProperty("PropertyName", QVariant(PropertyValue));
     QQmlComponent component(&engine, QUrl::fromLocalFile("MyItem.qml"));
     component.create();


Ну вопервых это как то убого у каждого нужного тебе компонента задавать помимо id еще и objectName, а во вотрых в доках написано, что перемещаться по дереву объектов QML таким способом не комильфо и такой способ должен использоваться для отладки. И как бы не понятно как мне связать мои представления с моделями, которые на С++.

Еще один способ: это использовать Q_PROPERTY и Q_INVOKABLE для доступа к свойствам и методам класса, который потом зарегестрировать через qmlRegisterType. Это опять же как то убого, и не дает простого установить модель представлению, а только через объект посредник. Есть вариант можно регестрировать класс который и будет моделью (я не много не понял детали этой рализации), но это не избавляет от самого тупого в этом решении - необходимости писать import <ClassName> <Version> в QML файле.

Так же не очень понятно с сигналами и слотами. Конечно дока QT предлагает зарегать синглтон и через него передавть все на свете и свойства и сигналы и слоты там наделать и методы. Мне кажется это лучшим вариантом.
Поначалу когда читаешь доки везде написано, что все легко и просто, и мы только и сделали все это что бы вам было удобно. Но на деле QML крайне плохо интегрирован с Си++. Я с трудом нашел способ что бы связать модель на Си++ с представлением QML и то, как утверждает документация плохим способом. Складывается впечатление, что все приложение нужно делатьт на QML, а его логику писать на JS. Немного резюмируя, как обрабатывать события QML интерфейса, как связать QML с данными на бэкенде на Си++ ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iDarkLord
  опции профиля:
сообщение 31.10.2014, 12:28
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 20.10.2014
Пользователь №: 4255

Спасибо сказали: 0 раз(а)




Репутация:   0  


Короче, нужно юзать регистрацию класса в системе QML как синглтона функцией

static QObject *getSingletoneController(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    QmlAppCtrl *Ctrl = new QmlAppCtrl();
    return Ctrl;
}


int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlEngine engine;
    qmlRegisterSingletonType<QmlAppCtrl>("API.Control", 1, 0, "Ctrl", getSingletoneController);
    ...
}


Пример http://qt-project.org/doc/qt-5/qtqml-tutor...cs-example.html
Там правда не используется синглтон, а просто регестрируется тип QML, но взаимодействие меду классом и гуи описано отлично.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 10:34