2016-07-25 3 views
1

Я использую 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.

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

+1

Рассмотрите также публикацию синглэда C++ как Singleton QML, а затем прикрепление к нему явно в QML, например: MyController {business: MyBusiness; } '. – Velkan

+0

Хорошая точка, спасибо! – arennuit

ответ

1

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

import QtQuick 2.5 

Item { 
    MyController { 
     business: businessObj 
    } 

    MyBusiness { 
     id: businessObj 
    } 
} 

В MyController.h:

class MyController 
{ 
    Q_OBJECT 
    Q_PROPERTY(MyBusiness* business MEMBER m_business); 
    ... 
    MyBusiness *m_business; 
+0

Это интересная идея, спасибо. – arennuit

0

Вот решения я думал о:

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

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