2016-05-16 18 views
4

C++オブジェクトをQMLから動的に作成したいとします。私はというクラスを作成し、Carという名前をつけてQMLに公開しました。これはqmlRegisterType<Car>("org.qtproject.models", 1, 0, "Car");です。QMLからC++オブジェクトを動的に作成

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

をしてからcar_1オブジェクトを使用して、私がする必要がある場合は簡単にC++に戻ってそれを渡す:QML内部で私はこのようなCarオブジェクトをインスタンス化することができています。しかし、私が望むのは、に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++オブジェクトを作成する方法はありますか? Carが定義されている*.qmlファイルがないため、がC++に定義されているため、Qt.createComponentも使用できませんでした。

+0

私はよく分かりませんが、問題は 'import QtQuick 2 'を含める必要があることです。0; '' Qt.createQmlObject'に渡された文字列内 – Tarod

+0

@Tarod答えに感謝します。私はまた 'component = Qt.createQmlObject(" import QtQuick 2.4; import org.qtproject.models 1.0; car {id:car_1; carName:\ "H1 \"; carBrand:\ "Hummer \"; carPrice:125000;} "、parent、" dynamicSnippet1 ");' qrc:/main.qml:58:Error:コードが実行されたときにグローバルプロパティ "component"に無効な書き込みが発生しました... –

+2

'component = Qt.createQmlObject'の代わりに' var component = Qt.createQmlObject'を書いていますか? – Tarod

答えて

1

私がコメントで言ったように、問題はその時点で存在していない変数component、です。実際には、すべてのQMLのオブジェクトが動的に割り当てられている

onClicked: { 
    var component = Qt.createQmlObject(...); 
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

:によって

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

:だから、次のコードを交換するのに十分であるという問題を解決する

。あなたの場合はCarもあります。 Loaderと他の選択肢はqmlに向けるためのものです。したがって、C++側でqmlオブジェクトを渡したい場合は、Car *パラメータを持つスロット/呼び出し可能な関数が必要です。スロット/呼び出し可能な関数では、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); 
}; 

を仮定そして、あなたは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 
} 
関連する問題