簡體   English   中英

如何通過 QVector<custom_q_gadget> 到 QML?</custom_q_gadget>

[英]How to pass QVector<Custom_Q_GADGET> to QML?

我有具有 2 個屬性的 QObject class:

class Foo : public QObject {
Q_OBJECT
    Q_PROPERTY(QVector<Namespace1::Namespace2::Item> items READ getItemVector)
    Q_PROPERTY(QVector<QString> tests READ getTestVector)
    ...
}

QVector<Namespace1::Namespace2::Item> Foo::getItemVector() const
{
    return _item_vector;
}

QVector<QString> Foo::getTestVector() const
{
    return _test_vector;
}

QVectorQString的 QVector 一切正常,但我無法通過Namespace1::Namespace2::ItemQVector

Output 到 QML 控制台給了我: QVariant(QVector<Namespace1::Namespace2:Item>) for console.log(foo.items) 和length = undefined for console.log(foo.items.length)

我從 Qt 文檔中發現的內容:

這些序列類型是根據底層 C++ 序列直接實現的。 有兩種方式可以將此類序列暴露給 QML: 作為給定序列類型的 Q_PROPERTY; 或作為 Q_INVOKABLE 方法的返回類型。

...

特別是,QML 當前支持: ... QList< QString >... 以及所有已注冊的 QList、QVector、QQueue、QStack、QSet、QLinkedList、std::list、std::vector,它們包含用 Q_DECLARE_METATYPE 標記的類型。

據我了解,一切都歸結為:

Q_DECLARE_METATYPE(Namespace1::Namespace2::Item)

除此以外:

某些類型是自動注冊的,不需要此宏:指向派生自 QObject、QList< T >、 QVector< T > 、QQueue< T >、QStack< T >、QSet< T > 或 QLinkedList 的類的指針,其中 T 是已注冊的元類型

但是,我也嘗試聲明元類型(顯然沒有運氣):

Q_DECLARE_METATYPE(QVector<Namespace1::Namespace2::Item>)

並且還嘗試注冊元類型(也沒有任何運氣):

qRegisterMetaType<Namespace1::Namespace2::Item>("Namespace1::Namespace2::Item");
qRegisterMetaType<QVector<Namespace1::Namespace2::Item>>("QVector<Namespace1::Namespace2::Item>");

Item本身就是一個Q_GADGET

namespace Namespace1 { namespace Namespace2 {
    class Item
    {
    Q_GADGET
        Q_PROPERTY(QString name READ getName CONSTANT)

    public:
        Item();
        Item(const QString& name);
        Item(const Item& origin);
        Item(Item&& origin);
        ~Item();

    private:
        QString _name;

    public:
        Item& operator=(const Item& rhs);
        Item& operator=(Item&& rhs);

    friend QDataStream& operator<<(QDataStream& out, const Item& item);
    friend QDataStream& operator>>(QDataStream& in, Item& item);
    friend QDebug operator<<(QDebug debug, const Item& item);
    }
} }

我錯過了什么? 謝謝!

這樣做的“傳統”方式是將每個元素轉換為 QVariant,並將集合作為 QVariantList 傳遞

QVariantList MyClass::getFooCollection(void) const
{
    QVariantList list;

    for (const auto& l: fooCollection_)
    {
        list.append(QVariant::fromValue(l));
    }

    return list;
}

您顯示的元類型系統聲明和注冊是必需的

暫無
暫無

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

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