【发布时间】:2023-06-23 06:10:01
【问题描述】:
我正在尝试使用相应的参数创建自定义类实例并将其传递给 Q_INVOKABLE 函数。 我试图举一个例子来指出我想要做什么。所以基本上我有一个类 Foo 和另一个类 Bar 有一个以 Foo 作为参数的函数。我想在 QML 中调用此函数,但我不知道如何实例化 Foo 以将其作为该函数的参数传递。
编辑 - 有关主要目标的更多信息:
真正的目标是拥有一个包含自定义类对象列表的子类 QAbstractItemModel。然后将使用模型 data() 函数表示该列表。该模型应该以某种方式表示为 QML 中的视图。我也想在运行时填充模型。所以模型类应该有一个函数,它接受一个自定义类实例并将其附加到内部列表中。所以我的方法是在 qml 中创建并传递自定义类实例。我还没有找到任何例子来做那种事情。 这是我所拥有的:
Foo.h
class Foo : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName)
public:
Foo(QString fooName, QObject *parent = 0) : QObject(parent){
name = fooName;
}
QString getName() const {
return name;
}
void setName(const QString &value){
name = value;
}
private:
QString name;
};
Bar.h
class Bar : public QObject
{
Q_OBJECT
public:
explicit Bar(QObject *parent = 0) : QObject(parent){}
Q_INVOKABLE void addFoo(const Foo &foo){
fooList.append(foo);
}
private:
QList<Foo> fooList;
};
main.cpp
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<Foo>("Test", 1, 0, "Foo");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.rootContext()->setContextProperty("bar", new Bar());
return app.exec();
}
main.qml
import Test 1.0
Window {
Button {
id: addFoo
text: "Add new Foo to Bar"
onClicked: {
bar.addFoo(????)
}
}
}
【问题讨论】:
-
作为一般规则,在加载 QML 之前设置上下文属性。上下文属性必须在加载引用上下文属性的QML之前设置。它仍然可以工作,但你可能会因此而招致奇怪的错误。