Q ++

2014-10-16 32 views
14

hesaplamaları için C++ yapıları nasıl ortaya çıkar Şu sorunla karşılaşıyorum.Q ++

C++'da bir model geliştiriyorum ve Qml'de bir Görünüm geliştirip bunları Controllers üzerinden bağlarım. Benim modelimde çoklu hesaplamalar yapıyorum. Ayrıca, uygulamamın kullanıcılarına, qml'de yazılmış özel etkinlik işleyicileri yazma olanağı da sunuyoruz. Şimdi Sabit nokta gösterimi kullanmaya karar verdiğim ve karşılık gelen bir C++ sınıfı yazdığım bir noktaya rastladım. Şimdi, tüm operatörleri de dahil olmak üzere, FixedPoint sınıfını, uygulamanızı Qml'de genişletmeye karar veren geliştiricilere sunmak istiyorum. Şimdiye kadar, tüm verileri kodlama yönergelerinin gerektirdiği QProperties olarak sundum. Ancak, ekibimde bunları tartışmak için diğer çözümlere açığım. Açıkçası, sabit bir nokta kimlik değildir ve algoritmalar kopyalama olasılığına dayanır; bu, QObject öğesinden devralma sırasında izin verilmez.

Soru şu: Bir C++ sınıfı/yapısını QML'ye nasıl açıklayabilirim, bu bir kimlik DEĞİLDİR?

kod örneği:

struct FixedPoint 
{ 
    FixedPoint(FixedPoint&); 
    FixedPoint& operator=(FixedPoint&); 
    ... 
    int mantissa; 
    int exponent; 
} 
C++ ile yazılmış bir QQuickItem bir özelliği (değer) olarak QML kullanmak isteyen

:

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

özelliği değeri daha sonra javascript hesaplamaları boyunca kullanılan ve uzun bir şekilde birkaç kez kopyalanır. Bu yüzden FixedPoint * tipi bir özellik değeri yapamıyorum. Ben haklı mıyım

+1

Q_DECLARE_METATYPE' + 'qmlRegisterMetatype' kullanmayı denediniz mi? Bu durumda değerleri sadece sinyaller/yuvalar yoluyla geçirebileceğinizi unutmayın. Çünkü, bir şeyi QML'ye doğrudan aktarmak için, bir "QObject" olmalıdır. Operatörler QML içinde çalışmayacaktır çünkü QML dilini genişletemezsiniz :) –

+1

Örneğinizi iletmeniz gerekiyorsa (örneğin, javascript ifadelerinde kullanmanız gerekmez), örneğinizi QVariant olarak kullanabilirsiniz. – sergk

+1

Diğer taraftan, onu qml'de kullanmanız gerekiyorsa, QObject'ten türetmeniz veya QMap 'yi kullanmanız gerekir. – sergk

cevap

4

Yardımlarınız için teşekkürler. Yine de QObject'i kullanmaya karar verdik, ancak Wrapper tarzında. Yani, biz sadece gerçek bir FixedPointValue tutan bir FixPointWrapper (QObject miras) inşa ettik. Bu daha sonra hesaplamalar için kullanılabilir. Sesler karmaşık, ancak iyi çalışıyor. Özellikle bizim için önemli olan, FixedPoint değerlerini kopyalamak ve atamaktır. Böylece sargıya ihtiyaç vardır.

//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;  
} 

Başlangıçta kirli bir hack gibi hissettim, ama biz birkaç düşünce geçirdi sonra biz sonuçla yaşayabilir.

Yine yardımlarınız için teşekkürler.