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

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

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

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

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

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

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

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

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

14

Решение

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

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

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

4

Другие решения


По вопросам рекламы [email protected]