Элементы управления QML и бизнес-уровни

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

В очень приземленном виде все мои события должны быть отправлены на уровень управления C++ (класс C++, называемый MyController, который наследуется от QObject). Теперь MyController должен знать о бизнес-уровне (скажем, это класс C++ с именем MyBusiness) и вызывать соответствующие методы.

Мой MyBusiness на самом деле представляет собой сложную совокупность классов более низкого уровня, которые я собрал вместе в main.cpp.

Раньше я использовал QtWidget и мог создать MyBusiness с помощью этой сложной агрегации, упомянутой выше, создать MyController и предоставить MyBusiness для MyController. чтобы он выполнял свою работу.

Теперь, благодаря способу работы QML, MyController фактически предоставляется QML (через регистрацию QML), а функции MyController Q_INVOKABLE вызываются из QML и должны, в свою очередь, вызывать MyBusiness. функции.

Но MyController теперь фактически создается в QML, поэтому я больше не могу сообщать MyController о MyBusiness.

Какова наилучшая практика в моем случае?


person arennuit    schedule 25.07.2016    source источник
comment
Рассмотрите также публикацию синглтона C++ как синглтона QML, а затем явное присоединение к нему в QML, например: MyController { business: MyBusiness; }.   -  person Velkan    schedule 26.07.2016
comment
Хороший вопрос, спасибо!   -  person arennuit    schedule 26.07.2016


Ответы (2)


мне это нравится:

import QtQuick 2.5

Item {
    MyController {
        business: businessObj
    }

    MyBusiness {
        id: businessObj
    }
}

In MyController.h:

class MyController
{
    Q_OBJECT
    Q_PROPERTY(MyBusiness* business MEMBER m_business);
    ...
    MyBusiness *m_business;
person Velkan    schedule 26.07.2016

Вот решения, о которых я думал:

  1. Я мог бы создать MyBusiness внутри MyController, но это было бы немного грязно (поскольку ответственность за бизнес не должна лежать в руках контроллера).
  2. Я также мог бы создать третий класс MyApplication, единственной целью которого было бы объединение MyController и MyBusiness, но тогда каждый раз, когда я создаю новую функцию Q_INVOKABLE, я пришлось бы создать функцию в MyApplication (для вызова) и передать ее в MyController (чтобы он вызывал MyBusiness. Это не так). Я ленив, но эта избыточность добавит бремени обслуживания
  3. Я мог бы создать синглтон MyBusiness и вызвать его из MyController.
  4. Я мог бы использовать подход @Velkan (см. выше)

Я решил использовать решение 3 (поскольку оно лучше подходит для моего варианта использования), но решение 4 (от @Vulkan) также полезно в некоторых случаях использования. Решения 1 и 2 менее ценны.

person arennuit    schedule 27.07.2016