Dynamically create a C ++ object from QML

I want to dynamically create an object C++from QML. I created a derived class QObjectwith the name Carand exposed it QMLwith qmlRegisterType<Car>("org.qtproject.models", 1, 0, "Car");. Inside QMLI can create an instance of an object Caras follows:

Car {
    id : car_1
    carName : "H1"
    carBrand : "Hummer"
    carPrice : 125000
} 

and then use the object car_1and pass it back on C++with ease if I need to. But I would like to create a dynamic object Carin QML, so I can pass it back to C++.

I tried:

MouseArea
{
    anchors.fill: parent
    onClicked: {
        component = Qt.createQmlObject("Car { id: car_1; carName : \"H1\"; carBrand : \"Hummer\"; carPrice : 125000; }",
                                       parent, "dynamicSnippet1");

        myCarModel.appendRowFromQml(component);
    }
}

but no luck. When using the static approach, it works fine:

MouseArea
{
    anchors.fill: parent
    onClicked: {
        myCarModel.appendRowFromQml(car_1);
    }
}

C++ QML? Qt.createComponent, *.qml, Car, Car C++.

+4
3

, component, .

, , :

onClicked: {
    component = Qt.createQmlObject(...);

:

onClicked: {
    var component = Qt.createQmlObject(...);
+1

Loader.

- :

Loader {
   id: carLoader
   active: false
   sourceComponent:
   Car {
       id : car_1
       carName : "H1"
       carBrand : "Hummer"
       carPrice : 125000
   } 

MouseArea
{
    anchors.fill: parent
    onClicked: carLoader.active:true
}
+2

qml . Car . Loader qml. , qml ++, slot/invokable Car *. slot/invokable , qml-.

, Car, ,

class Car : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

public:
    explicit Car(QObject *parent = Q_NULLPTR);
    ~Car();

    QString name();
    void setName(const QString &name);

signals:
    void nameChanged();

private:
    QString m_name;
};

Store, ,

class Store : public QObject {
    Q_OBJECT
public:
    explicit Store(QObject *parent = Q_NULLPTR);

    Q_INVOKABLE void sell(Car *car);
};

Car qml,

Car {
    id: car1
    name: "H1"
}

MouseArea {
    anchors.fill: parent
    onClicked: Store.sell(car1);
}

,

void Store::sell(Car *car)
{
    qDebug() << car->name() << "just sold!!";
    QQmlEngine::setObjectOwnership(car, QQmlEngine::CppOwnership);
    delete car; // proof of the car is dynamically allocated
}
+1

All Articles