2014-10-16 8 views
14

Mam następujący problem.Jak odsłonić struktury C++ dla obliczeń do Qml

Opracowuję model w C++ i widok w Qml, łącząc je za pomocą kontrolerów. W moim modelu wykonuję wiele obliczeń. Oferuję również użytkownikom mojej aplikacji możliwość pisania własnych programów obsługi zdarzeń napisanych w qml. Teraz natknąłem się na punkt, w którym zdecydowałem się użyć notacji o stałym punkcie i napisałem odpowiednią klasę C++. Teraz chcę zaoferować klasie FixedPoint - w tym wszystkim jej operatorom - programistom, którzy zdecydują się rozszerzyć moją aplikację w Qml. Do tej pory oferowałem wszystkie dane jako QProperties, co jest wymagane przez wytyczne dotyczące kodowania. Ale jestem otwarty na inne rozwiązania, aby omówić je w moim zespole. Oczywiście, stały punkt nie jest tożsamością, a algorytmy polegają na możliwości jego kopiowania, co nie jest dozwolone przy dziedziczeniu z QObject.

Pojawia się pytanie: Jak mogę odsłonić klasę/klasę C++ dla QML, która NIE jest tożsamością?

Przykładem w kodzie:

struct FixedPoint 
{ 
    FixedPoint(FixedPoint&); 
    FixedPoint& operator=(FixedPoint&); 
    ... 
    int mantissa; 
    int exponent; 
} 

Chcę używać go w QML jako nieruchomości (wartość) z QQuickItem napisany w C++:

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

Obiekt wartość jest następnie używany w obliczeniach w javascript i jest kopiowany kilka razy dłużej. Nie mogę więc uczynić wartości właściwością typu FixedPoint *. Czy mam rację?

+1

Czy próbowałeś użyć 'Q_DECLARE_METATYPE' +' qmlRegisterMetatype'? Pamiętaj, że w tym przypadku możesz przekazywać wartości tylko za pośrednictwem sygnałów/gniazd. Ponieważ, aby bezpośrednio przekazać coś do/z QML, musi to być 'QObject'. Operatory nie będą działały w QML, ponieważ nie możesz rozszerzyć języka QML :) –

+1

Możesz owinąć swoją instancję jako QVariant, jeśli tylko chcesz ją przekazać (np. Nie musisz jej używać w wyrażeniach javascript). – sergk

+1

Z drugiej strony, jeśli potrzebujesz go faktycznie użyć w qml, powinieneś wyprowadzić z QObject lub użyć QMap . – sergk

Odpowiedz

4

Dzięki za pomoc. Postanowiliśmy użyć QObject w każdym razie, ale w sposób Wrapper. Oznacza to, że właśnie zbudowaliśmy FixPointWrapper (dziedziczący QObject), który przechowuje rzeczywistą wartość FixedPointValue. To może być następnie użyte do obliczeń. Brzmi skomplikowanie, ale działa dobrze. Szczególnie ważne dla nas jest możliwość kopiowania i przypisywania wartości FixedPoint. Zatem opakowanie jest potrzebne.

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

Na początku wyglądało to jak brudne hacki, ale po tym, jak spędziliśmy kilka kolejnych myśli, możemy żyć z wynikiem.

Jeszcze raz dziękuję za pomoc.

Powiązane problemy