![](/img/trans.png)
[英]Create qml object dynamically from c++ object (by using setContextProperty)
[英]Dynamically create C++ object from QML
我想從QML
動態創建C++
對象。 我創建了一個名為Car
的QObject
派生類,並使用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.