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

Mat*_*ttW 14 c++ qt qobject qml qquickitem

我有以下问题.

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

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

代码中的一个例子:

struct FixedPoint
{
    FixedPoint(FixedPoint&);
    FixedPoint& operator=(FixedPoint&);
    ...
    int mantissa;
    int exponent;
}
Run Code Online (Sandbox Code Playgroud)

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

MyQmlObject{
    value{ mantissa: 134; exponent: 3 }
}
Run Code Online (Sandbox Code Playgroud)

然后在javascript中的整个计算中使用属性,并将其复制多次.所以我认为我不能将值设为FixedPoint*类型的属性.我对吗?

Mat*_*ttW 4

感谢您的帮助。无论如何,我们决定使用 QObject,但是以包装方式。也就是说,我们只是构建了一个FixPointWrapper(继承QObject),它保存了一个实际的FixedPointValue。然后就可以用于计算了。听起来很复杂,但效果很好。对我们来说特别重要的是复制和分配定点值的可能性。因此,需要包装纸。

//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;    
}
Run Code Online (Sandbox Code Playgroud)

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

再次感谢您的帮助。