从QML动态创建C ++对象

时间:2016-05-16 11:58:59

标签: c++ qt qml qtquick2 qt-quick

我想从C++动态创建QML对象。我创建了一个名为QObject的{​​{1}}派生类,并使用Car将其公开给QML。在qmlRegisterType<Car>("org.qtproject.models", 1, 0, "Car");内部,我可以像这样实例化一个QML对象:

Car

然后使用Car { id : car_1 carName : "H1" carBrand : "Hummer" carPrice : 125000 } 对象,如果需要,可以轻松地将其传回car_1。但我想要的是在C++中动态创建Car对象,因此我可以将其传递回QML

我试过了:

C++

但没有运气。使用静态方法,工作正常:

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

        myCarModel.appendRowFromQml(component);
    }
}

有没有办法从MouseArea { anchors.fill: parent onClicked: { myCarModel.appendRowFromQml(car_1); } } 方面动态创建C++对象?我也无法使用QML因为Qt.createComponent文件中没有定义*.qml,因为Car中定义了Car

3 个答案:

答案 0 :(得分:2)

您可以使用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
}

答案 1 :(得分:1)

正如我在评论中所说,问题是变量component,当时不存在。

因此,要解决此问题,只需替换以下代码即可:

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

由:

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

答案 2 :(得分:1)

实际上所有的qml对象都是动态分配的。在您的情况下Car也有。 Loader和其他替代方案仅用于指导qml。所以如果你想在C ++端传递一个qml对象,你唯一需要的是带有Car *参数的slot / invokable函数。在您的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;
};

和类似的商店类,

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

    Q_INVOKABLE void sell(Car *car);
};

如果你将你的Car对象传递给qml上的Store对象,

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
}