14

我有以下问题。

我正在开发一个 C++ 模型和一个 Qml 视图,通过控制器连接它们。在我的模型中,我执行多个计算。我还为我的应用程序的用户提供了编写自定义事件处理程序的可能性,用 qml 编写。现在我遇到了一个点,我决定使用定点表示法,并且我编写了一个相应的 C++ 类。现在我想向决定在 Qml 中扩展我的应用程序的开发人员提供 FixedPoint 类 - 包括它的所有运算符。到目前为止,我以 QProperties 的形式提供了所有数据,这是编码指南所要求的。但我愿意在我的团队中讨论其他解决方案。显然,一个固定点是没有身份的,算法依赖于复制它的可能性,这在从 QObject 继承时是不允许的。

所以问题来了:我怎样才能将一个 c++ 类/结构暴露给 QML,这不是一个身份?

代码中的一个例子:

struct FixedPoint
{
    FixedPoint(FixedPoint&);
    FixedPoint& operator=(FixedPoint&);
    ...
    int mantissa;
    int exponent;
}

我想在 Qml 中使用它作为用 C++ 编写的 QQuickItem 的属性(值):

MyQmlObject{
    value{ mantissa: 134; exponent: 3 }
}

然后,属性在 javascript 中的整个计算中使用,并在整个过程中被复制多次。因此,我认为我不能将 value 设为 FixedPoint* 类型的属性。我对吗?

4

1 回答 1

4

谢谢你的帮助。无论如何,我们决定使用 QObject,但是以 Wrapper 的方式。也就是说,我们只是构建了一个 FixPointWrapper(继承 QObject),它保存了一个实际的 FixedPointValue。那可以用于计算。听起来很复杂,但工作正常。对我们来说特别重要的是复制和分配 FixedPoint 值的可能性。因此,需要包装器。

//QML
MyQmlObject{
    value {mantissa: 2; exponent: 4}
}


//C++
class MyQmlObject : public QQuickItem
{
    Q_Property( FixedPointWrapper* value ... )
}

class FixedPointWrapper : public QObject
{
    ...
    public slots:
       void setValue(FixedPoint){ //Forward to FixedPoint and implement your wanted effect. The same for getter} 
    private:
    FixedPoint value;    
}

一开始感觉像是一个肮脏的黑客,但在我们多想了一些之后,我们可以接受结果。

再次感谢您的帮助。

于 2014-10-20T14:04:32.617 回答