2014-10-16 152 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;  
} 

在開始的時候覺得自己像一個骯髒的黑客,但之後我們花了幾個想法,我們可以用結果住。

再次感謝您的幫助。