qt — Как использовать класс C ++ в компоненте QML

Я пытаюсь разработать приложение на Компонент QML, который встраивает один класс C ++.
Мой класс следующий:

class Fleche : public QQuickPaintedItem   // Fleche = arrow
{
public :
Fleche();
~Fleche();

protected :
QPainterPath arrow;
private :
void paint(QPainter *painter){
// Draw

arrow.moveTo(50,50);
arrow.lineTo(0,0);
arrow.cubicTo(20,100/3,20,2*100/3,0,100);
arrow.closeSubpath();

// Paint

QLinearGradient gradient(0, 0, 0, 100);
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(1.0, Qt::darkBlue);
QBrush fill(gradient);
painter->setBrush(fill);
painter->setRenderHint(QPainter::Antialiasing);
painter->drawPath(arrow);
}

};

Этот элемент должен быть реализован 4 раза в моем коде QML, и его необходимо поворачивать, анимировать и изменять размер.
Я думаю, я должен использовать updatePaintNode () но, как дизайнер (по крайней мере, не кодер), я испытываю трудности при смешивании языков …
Идея состоит в том, чтобы иметь в моем коде QML:

Fleche {
id : arrowNumberX // X is from 0 to 3
width : 0.1 * parent.width
height : 0.15 * parent.height
z : 1
rotation : X * 90
MouseArea{ /.../}
SequentialAnimation{/.../}
}

Любой пример или помощь о том, как реализовать мой объект в моем приложении QML, очень мне поможет!

0

Решение

У вас есть как минимум 3 способа реализовать свой собственный элемент QML (упорядоченный от быстрого к медленному).

  1. [C ++] Создать класс, производный от QQuickItem и переопределить
    QQuickItem :: updatePaintNode ()
  2. [C ++] Создать класс, производный от QQuickPaintedItem и переопределить
    QQuickPaintedItem :: краска ()
  3. [QML] Создание элемента на основе Canvas (см. Ответ @ Jérémy Mrgt)
0

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

Лучшая идея для этого, это использовать Canvas — http://doc.qt.io/qt-5/qtquick-canvas-example.html, Вы получите меньший и чистый код.

Вы можете создать новый компонент с именем Fleche.qml и использовать его где угодно (повернутый, анимированный и изменяющий размер, …)

0

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