Как выставить структуры С++ для вычислений в Qml

У меня есть следующая проблема.

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

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

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

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

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

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

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

Ответ 1

Спасибо за вашу помощь. Мы решили использовать 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;    
}

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

Итак, спасибо за вашу помощь.