簡體   English   中英

從QML動態創建C ++對象

[英]Dynamically create C++ object from QML

我想從QML動態創建C++對象。 我創建了一個名為CarQObject派生類,並使用qmlRegisterType<Car>("org.qtproject.models", 1, 0, "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++ 但我想要的是在QML動態創建一個Car對象,所以我可以將它傳遞給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);
    }
}

有沒有辦法從QML端動態創建C++對象? 我也無法使用Qt.createComponent因為沒有定義Car *.qml文件,因為Car是在C++中定義的。

您可以使用裝載程序

像這樣的東西:

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

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

正如我在評論中所說,問題是變量component ,當時不存在。

所以要解決這個問題就足以取代以下代碼:

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

通過:

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

實際上所有的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;
};

和類似的Store類,

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM