簡體   English   中英

QML自定義列表數據類型

[英]QML Custom List Data type

我想知道在QML中是否可以定義可以在QML中使用的自定義列表類。

目前,我正在解析或多或少復雜的數據結構,並將它們轉換為QVariantMap,QVariantList和QVariants的樹。
但是,這些類型可能包括大多數基本類型的數組(uint8_t,uint16_t,...,uint64_t,int8_t,...,float,double)。
如果由於顯而易見的性能原因我不必將這些數組復制到QVariantList中,我更喜歡它。
有沒有什么方法可以將數組包裝在一個自定義類型中,以QML理解的方式提供項訪問,因此只在請求時將元素復制到QVariant?

我已經嘗試使用Q_INVOKABLE operator[]注冊一個類型,但這似乎不起作用。

更新:澄清一點。 我知道我可以使用可以提供訪問器方法的自定義屬性創建一個類。 但是,使用QVariantList方法,我可以在QML中執行以下操作

onMessage: {
  element.text = message.poses[0].position.x
}

我正在尋找一種方法來包裝數組,使得實際的實現在QML中不明顯,這意味着,它應該看起來像一個普通的數組,可以使用括號運算符等進行訪問。事實上它實際上只是一個包裝器應該對用戶完全透明。

您可以將數組包裝在QObject ,並將其作為上下文屬性傳遞給QML部件。

例如,要在QML中使用整數向量:

class ArrayInterface: public QObject
{
    Q_OBJECT
    using value_t = int;
public:
    ArrayInterface(std::vector<value_t> const& src): QObject(), source(src)
    {}
    // Can be called from QML
    Q_INVOKABLE int get(int idx) const
    {
        return source[idx];
    }
private:
    std::vector<value_t> const& source;
};
int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    std::vector<int> vec = {12, 4, 5, 7};
    ArrayInterface data(vec);

    QQuickView view;
    view.rootContext()->setContextProperty("myArray", &data);
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    return app.exec();
}
Item {
    height: 500
    width: 500
    Text { text: myArray.get(0) }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM