QML控制和业务层

时间:2016-07-25 17:39:43

标签: c++ qt qtquick2 qt-quick qtquickcontrols

我第一次使用QML,并且很难在控件和业务层之间组织我的代码。

以一种脚踏实地的方式,我的所有事件都应该被发送到C ++控制层(一个名为 MyController 的C ++类,它继承自 QObject )。现在 MyController 应该知道业务层(比如说它是一个名为 MyBusiness 的C ++类)并调用它的相关方法。

我的 MyBusiness 实际上是我在 main.cpp 中放在一起的较低级别类的复杂聚合。

之前我使用的是QtWidget,我可以通过上面提到的这个复杂的聚合创建 MyBusiness ,创建 MyController 并提供 MyBusiness 到< strong> MyController 让它完成它的工作。

现在由于QML的工作方式, MyController 实际上暴露于QML(通过QML注册), MyController Q_INVOKABLE函数从QML调用,应该反过来调用 MyBusiness 函数。

MyController 现在实际上是在QML中创建的,因此我无法让 MyController 了解 MyBusiness

在我的案例中,最佳做法是什么?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

以下是我想过的解决方案:

  1. 我可以在 MyController 中创建 MyBusiness ,但这有点脏(因为业务责任不应该在控制人手中)。
  2. 我还可以创建第3个 MyApplication 类,其唯一目的是加入 MyController MyBusiness ,但每次创建新的Q_INVOKABLE函数我必须在 MyApplication (要调用)中创建函数并将其传递给 MyController (用于调用 MyBusiness 。这并不是说我很懒,但这种冗余会增加维护负担
  3. 我可以制作 MyBusiness 的单身,并从 MyController
  4. 调用它
  5. 我可以使用@ Velkan的方法(见上文)
  6. 我决定采用解决方案3(因为它更适合我的用例),但解决方案4(来自@Vulkan)在某些用例中也很有价值。解决方案1和2的价值较低。