2014-10-16 117 views
14

我遇到以下问题。如何将用于计算的C++结构体暴露给Qml

我正在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的整个计算过程中使用,并复制了很多次。因此,我认为无法将价值视为FixedPoint *类型的财产。我对吗?

+1

您是否尝试过使用'Q_DECLARE_METATYPE' +'qmlRegisterMetatype'?请注意,在这种情况下,您只能通过信号/插槽传递值。因为,要直接将某些内容传递给QML,必须将它作为'QObject'。运营商不会在QML内工作,因为您无法扩展QML语言:) – 2014-10-16 14:39:59

+1

如果您只需要传递实例(例如,您不需要在JavaScript表达式中使用它),则可以将实例包装为QVariant。 – sergk 2014-10-17 03:47:06

+1

另一方面,如果您需要在qml中实际使用它,则应该从QObject派生或使用QMap 来代替。 – sergk 2014-10-17 03:50:24

回答

4

感谢您的帮助。 无论如何,我们决定使用QObject,但是采用Wrapper方式。也就是说,我们只是构建了一个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;  
} 

在开始的时候觉得自己像一个肮脏的黑客,但之后我们花了几个想法,我们可以用结果住。

再次感谢您的帮助。