Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过QVector<;定制小工具>;到QML?_C++_Qt_Qml - Fatal编程技术网

C++ 如何通过QVector<;定制小工具>;到QML?

C++ 如何通过QVector<;定制小工具>;到QML?,c++,qt,qml,C++,Qt,Qml,我有两个属性的QObject类: 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::

我有两个属性的QObject类:

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;
}
除此之外:

某些类型是自动注册的,不需要此宏:指向从QObject、QListQVector、QQueue、QStack、QSet或QLinkedList派生的类的指针,其中T是注册的元类型

但是,我也尝试声明元类型(显然运气不好):

我错过了什么? 谢谢大家!

执行此操作的“传统”方法是将每个元素转换为QVariant,并将集合作为QVariantList传递

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

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

    return list;
}

您显示的元类型系统声明和注册是必需的

您是否尝试使用指针:
QVector
?我意识到我经常走
QList
的路。。。不太理想,但因为我在QML中选演员,所以效果很好。@Amfasis谢谢你的回复。是的,我确实经常在QML中使用指针,但在本例中不使用。此外,我必须关心所有权,因为我需要一份副本。我花了一些时间试图让它工作,但实际上不能。。。我认为你应该考虑<代码> qqMListFielt,你也可以做只读,或者<代码> QuestActListMase。你说所有权是什么意思?@Amfasis谢谢你的努力,我也有同样的负面结果。最后,按照您的建议使用QML List属性重新实现。顺便说一句,你怎么认为,我应该在bugreports.qt.io报告一个bug吗?似乎已经有一些报告了:我得到的印象是,他们将推迟到Qt6
Q_DECLARE_METATYPE(QVector<Namespace1::Namespace2::Item>)
qRegisterMetaType<Namespace1::Namespace2::Item>("Namespace1::Namespace2::Item");
qRegisterMetaType<QVector<Namespace1::Namespace2::Item>>("QVector<Namespace1::Namespace2::Item>");
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);
    }
} }
QVariantList MyClass::getFooCollection(void) const
{
    QVariantList list;

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

    return list;
}