如何在QML组件中使用C ++类

时间:2017-06-12 15:40:04

标签: c++ qt qml mix

我试图在QML component which embeds one C++ class上设计一个应用程序。 我的课程如下:

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

};

这个项目应该在我的QML代码中实现4次,需要旋转,动画和调整大小。 我想我必须使用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应用程序中实现我的对象的任何示例或帮助都会对我有所帮助!

2 个答案:

答案 0 :(得分:0)

更好的想法是,使用Canvas - http://doc.qt.io/qt-5/qtquick-canvas-example.html,您将获得更小更清晰的代码。

你可以创建一个名为Fleche.qml的新组件,并在任何你想要的地方使用它(旋转,动画和可调整大小......)

答案 1 :(得分:0)

您至少有3种方法可以实现自己的QML项目(从更快到更慢排序)。

  1. [C ++]创建派生自QQuickItem的类并覆盖     QQuickItem::updatePaintNode()
  2. [C ++]创建派生自QQuickPaintedItem的类并覆盖 QQuickPaintedItem::paint()
  3. [QML]创建基于画布的项目(请参阅@JérémyMrgt的答案)