4

如何QVector在 QML/Javascript 中使用?例子:

C++:

我在 QML 中使用的自定义类。该类包括返回QVector注册的函数ElementType

class CustomType : public QObject
{
    Q_OBJECT

    public:
        Q_INVOKABLE QVector<ElementType*> getElements(); 
    //.....            
}
//.........
qmlRegisterType<CustomType>("CustomComponents", 1, 0, "CustomType");
qmlRegisterType<ElementType>("CustomComponents", 1, 0, "ElementType");
qRegisterMetaType<ElementType*>("ElementType*");

QML:

QML 代码接收类的实例CustomType(自定义)并尝试获取QVector<ElementType*>元素并读取其属性。但是 QML 不能识别QVector类型。

//.......
function(){
    var elements = custom.getElements()
    elements[0].property   //?
}
4

3 回答 3

1

QML 可访问的列表属性需要使用QDeclarativeListProperty. 这适用于所有列表形的东西,也适用于向量。这部分 Qt 文档有详细信息。

于 2012-07-30T13:57:15.943 回答
0

在您的示例中,您只需要从函数返回QList。请注意,以这种方式返回的所有对象都将拥有 JavaScript 所有权,并且在您的 JavaScript 函数返回时将被垃圾回收。为了防止这种行为,在将对象推送到您的集合之前使用setObjectOwnership 。有关在 QML 中使用集合的更多信息,请参阅QML 数据模型QObject*Q_INVOKABLEQList

于 2012-08-01T15:01:24.077 回答
0

我迟到了几年才回答,但是,这里有。这是一个很容易解决的问题。只需在 C++ 代码中使用 Qt QVariantList 类型而不是 QVector。Qt 的 QVariantList 本质上是一个包含 QVariant 元素的 QVector。一旦你知道你在做什么,QVariants 可以接近任何东西。此外,QML 会自动将 C++ QVariant 转换为其 QML 等效项。因此,如果您在 main.cpp 中执行此操作:

#include <QCoreApplication>
#include <QGuiApplication>
#include <QQmlContext>
#include <QQuickView>

int main(int argc, char *argv[])
{
    // Prepare to enter the QML GUI world
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    // Create a QVariantList to be used instead of a QVector
    QVariantList dataList;
    dataList << "Item 1";
    dataList << 2;
    dataList << 3.3;

    // Create QML UI
    QQuickView view;

    // make your QVariantList visible to QML
    QQmlContext *ctxt = view.rootContext();
    ctxt->setContextProperty("myModel",
                             QVariant::fromValue(dataList));

    // show QML UI
    view.setSource(QUrl("qrc:/main.qml"));
    view.show();

    return 1;

} // main()

然后,您可以在 main.qml 中执行此操作:

import QtQuick 2.12
import QtQuick.Window 2.12

Item
{
    // Print contents of C++ QVariantList to console
    function printMeBruh()
    {
        console.log("modelData contains:")
        console.log("-------------------")

        for (var i = 0; i < 3; i++)
        {
            console.log(myModel[i])
        }
    }

    Component.onCompleted: printMeBruh()

}
于 2020-03-30T16:40:49.410 回答