我想从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
。
答案 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
}