我尝试使用相应的参数创建自定义类实例并将其传递给Q_INVOKABLE函数。 我试图举个例子来指出我想做什么。所以基本上我有一个类Foo和另一个带有函数的类Bar,它将Foo作为参数。我想在QML中调用此函数,但我不知道如何实例化Foo以将其作为该函数的参数传递。
编辑 - 有关主要目标的更多信息:
真正的目标是拥有一个子类化的QAbstractItemModel,它包含一个自定义类对象的列表。然后使用models 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(????)
}
}
}
答案 0 :(得分:1)
在QML中传递对象之前,您应该通过 Foo 创建一个对象。 资料来源:Qt5 C++ GUI Programming Cookbook. Lee Zhi Eng,第37页
import Test 1.0
Window {
Foo {
id: Foo_object
}
Button {
id: addFoo
text: "Add new Foo to Bar"
onClicked: {
bar.addFoo(Foo_object)
}
}
}
答案 1 :(得分:1)
你可以使Foo
可实例化,给它一个可以不带参数调用的构造函数,然后使用CMLDMR建议的方法,或者添加一个&#34; factory&#34;可以创建实例的函数。
在后一种情况下,您需要使用Foo*
作为工厂函数的返回值和addFoo()
的参数,或者将Foo
更改为值类,使用属性的Q_GADGET
宏,而不是从QObject
鉴于Foo
中没有信号,我会推荐后者。
大致相同:
class Foo
{
Q_GADGET
Q_PROPERTY(...)
// ....
};
class Bar : public QObject
{
// ...
Q_INVOKABLE Foo createFoo(const QString &name);
Q_INVOKABLE void addFoo(const Foo &foo);
};
编辑:它还需要
qRegisterMetaType<Foo>();