如何将计算的C ++结构公开给Qml

时间:2014-10-16 13:18:05

标签: c++ qt qml qobject qquickitem

我有以下问题。

我正在开发一个C ++模型和一个Qml视图,通过控制器连接它们。在我的模型中,我执行多次计算。我还为我的应用程序的用户提供了编写自定义事件处理程序的可能性,用qml编写。 现在我遇到了一个问题,我决定使用固定点表示法,并编写了相应的C ++类。现在我想向开发人员提供FixedPoint类 - 包括其所有运算符 - 他们决定在Qml中扩展我的应用程序。到目前为止,我提供了所有数据作为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 *类型的属性。我是对的吗?

1 个答案:

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

一开始感觉就像一个肮脏的黑客,但在我们花了更多的想法后,我们可以忍受结果。

再次感谢您的帮助。