У меня есть класс 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::Item
s.
Вывод на консоль 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);
}
} }
Чего мне не хватает? Спасибо!