Как сдать QVectorв QML? - PullRequest
       1

Как сдать QVectorв QML?

1 голос
/ 08 октября 2019

У меня есть класс QObject с 2 свойствами:

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;
}

Все нормально с QVector из QString s в QML, но я не смог передать QVector из Namespace1::Namespace2::Items.

Вывод на консоль QML дает мне: QVariant(​QVector<Namespace1::Namespace2:​Item>)​ для console.log (foo.items) и length = undefined для console.log (foo.items.length)

Что я нашелиз документации Qt:

Эти типы последовательностей реализованы непосредственно в терминах базовой последовательности C ++. Есть два способа, которыми такие последовательности могут быть представлены QML: как Q_PROPERTY данного типа последовательности;или как тип возврата метода Q_INVOKABLE.

...

В частности, QML в настоящее время поддерживает: ... QList ... и всезарегистрированный QList, QVector, QQueue, QStack, QSet, QLinkedList, std :: list, std :: vector, которые содержат тип, помеченный Q_DECLARE_METATYPE.

Как я понимаю, все сводится просто к:

Q_DECLARE_METATYPE(Namespace1::Namespace2::Item)

Кроме этого:

Некоторые типы регистрируются автоматически и не нуждаются в этом макросе: указатели на классы, производные от QObject, QList , QVector , QQueue , QStack , QSet или 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);
    }
} }

Чего мне не хватает? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...