[英]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;
}
QVector
中QString
的 QVector 一切正常,但我无法通过Namespace1::Namespace2::Item
的QVector
。
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.