gpt4 book ai didi

c++ - 将自定义 C++ 类型作为 QML 函数参数传递

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:53 27 4
gpt4 key购买 nike

我正在尝试创建自定义类实例并将其传递给具有相应参数的 Q_INVOKABLE 函数。我试图举一个例子来指出我想做什么。所以基本上我有一个 Foo 类和另一个 Bar 类,它有一个以 Foo 作为参数的函数。我想在 QML 中调用此函数,但我不知道如何实例化 Foo 以将其作为该函数的参数传递。

编辑 - 有关主要目标的更多信息:

真正的目标是拥有一个包含自定义类对象列表的子类 QAbstractItemModel。然后将使用模型 data() 函数表示该列表。该模型应该以某种方式表示为 QML 中的 View 。我也想在运行时填充模型。所以模型类应该有一个函数,它接受一个自定义类实例并将它附加到内部列表。所以我的方法是在 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();
}

ma​​in.qml

import Test 1.0

Window {
Button {
id: addFoo
text: "Add new Foo to Bar"
onClicked: {
bar.addFoo(????)
}
}
}

最佳答案

你要么让 Foo 可以实例化,方法是给它一个可以在没有参数的情况下调用的构造函数,然后使用 CMLDMR 建议的方法,或者你添加一个可以创建实例的“工厂”函数。

在后一种情况下,您需要使用 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>();

关于c++ - 将自定义 C++ 类型作为 QML 函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com