2014-10-16 5 views
14

У меня есть следующая проблема.Как выставить структуры C++ для вычислений в Qml

Я разрабатываю модель на C++ и View в Qml, подключая их через контроллеры. В моей модели я выполняю несколько вычислений. Я также предлагаю пользователям моего приложения возможность писать пользовательские обработчики событий, написанные в qml. Теперь я наткнулся на точку, где решил использовать нотацию с фиксированной точкой, и я написал соответствующий класс C++. Теперь я хочу предложить классу FixedPoint, включая всех его операторов, разработчикам, которые решили продлить мое приложение в Qml. До сих пор я предлагал все данные как QProperties, что требуется в соответствии с инструкциями по кодированию. Но я открыт для других решений, чтобы обсудить их в моей команде. Очевидно, что фиксированная точка не является идентификатором, а алгоритмы полагаются на возможность ее копирования, что не допускается при наследовании от QObject.

Итак, вопрос приходит: Как я могу представить класс C++ C++ для QML, который НЕ является идентификатором?

Пример в коде:

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

Я хочу, чтобы использовать его в QML как свойство (значение) из QQuickItem написанного на C++:

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

значение свойства затем используется во всех вычислениях в javascript и копируется несколько раз в длину. Поэтому я не могу сделать значение свойства типа FixedPoint *, я думаю. Я прав?

+1

Вы пытались использовать 'Q_DECLARE_METATYPE' +' qmlRegisterMetatype'? Обратите внимание, что в этом случае вы можете передавать значения только через сигналы/слоты. Потому что, чтобы напрямую передать что-то в/из QML, это должен быть 'QObject'. Операторы не будут работать внутри QML, потому что вы не можете расширить язык QML :) –

+1

Вы можете обернуть свой экземпляр как QVariant, если вам просто нужно его передать (например, вам не нужно использовать его в выражениях javascript). – sergk

+1

С другой стороны, если вам нужно фактически использовать его в qml, вы должны получить QObject или вместо него использовать QMap . – sergk

ответ

4

Благодарим за помощь. Мы решили использовать QObject в любом случае, но в Wrapper-манере. То есть мы только что построили FixPointWrapper (наследующий QObject), который содержит фактический FixedPointValue. Тогда это можно использовать для вычислений. Звучит сложно, но отлично работает. Для нас особенно важно, чтобы скопировать и присвоить значения FixedPoint. Таким образом, необходима обертка.

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

В начале он почувствовал, как грязный хак, но после того, как мы провели несколько мыслей, мы можем жить с результатом.

Так что еще раз спасибо за помощь.