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

时间:2017-02-07 19:38:39

标签: c++ qt qml

我尝试使用相应的参数创建自定义类实例并将其传递给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(????)
        }
    }   
}

2 个答案:

答案 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>();