QML:QQmlListProperty <T>.T需要是QObject吗?

CK.*_*CK. 3 c++ qt qml

在文档中明确指出,具有列表的C++类必须从QObject继承,但是不清楚列表中的对象是否必须是QObject.
我已经使用QQmlListProperty以及QQmlListProperty 尝试了这种方法,但在这两种情况下我都会遇到以下错误:

QMetaProperty :: read:无法处理<QString>属性"ns :: Status :: values"的未注册数据类型"QQmlListProperty "

编辑:我的代码:

.HPP:

namespace ns{
class Status : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QQmlListProperty<QString> values READ values NOTIFY valuesChanged)

public:
    Status(QObject* parent = Q_NULLPTR);
    virtual ~Status();

    bool updateValues(const std::vector<std::string>& values);

    QQmlListProperty<QString> values();
    int valueCount() const;
    QString* value(int) const;

signals:
    void valuesChanged();

private:
    QVector<QString*> m_values_;

    std::vector<QString> m_valueStorage_;

    static int valueCount(QQmlListProperty<QString>*);
    static QString* value(QQmlListProperty<QString>*, int);
};
}
Run Code Online (Sandbox Code Playgroud)

的.cpp:

using namespace ns;
Status::Status(QObject* parent) :
    QObject(parent),
    m_values_(2),
    m_valueStorage_(2)
{}

Status::~Status(){}

bool Status::updateValues(const std::vector<std::string>& values)
{
    //Do Stuff

    emit valuesChanged();
    return true;
}

QQmlListProperty<QString> Status::values()
{
    return QQmlListProperty<QString>(this, nullptr, &Status::valueCount, &Status::value);
}

int Status::valueCount() const
{
    return m_values_.count();
}

QString* Status::value(int index) const
{
    return m_values_.at(index);
}

int Status::valueCount(QQmlListProperty<QString>* list){
    return reinterpret_cast<Status*>(list->data)->valueCount();
}

QString* Status::value(QQmlListProperty<QString>* list, int i){
    return reinterpret_cast<Status*>(list->data)->value(i);
}
Run Code Online (Sandbox Code Playgroud)

QML:

import Foo 1.0
Rectangle {
    Status {
        id: status
        objectName: "Status"
    }

    Component {
        id: value
        Rectangle { Text: {text: modelData } }
    }

    ColumnLayout {
        Repeater { model: status.values; delegate: value }
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,在我的主要内容之前,我将qml文件加载到QQmlApplicationEngine中:

qmlRegisterType<ns::Status>("Foo", 1,0, "Status");
Run Code Online (Sandbox Code Playgroud)

Gre*_*cKo 6

QQmlListProperty确实意味着要与之一起使用QObject.

尽管类中没有任何内容强制执行此限制,因为它都是模板化的,但QML引擎期望元素类型是QObject的子类.

Qt文档中的一个指示是这种情况可以在doc QQmlListReference(QQmlListProperty从c ++中操作的类)的doc中找到.本段提到QObject:

QML列表属性是类型安全的.只有从正确的基类派生的QObject才能分配给列表.listElementType()方法可用于查询支持的QObject类型的QMetaObject.尝试将不正确类型的对象添加到列表属性将失败.

QObject *QQmlListReference::at(int index) const方法也是另一条线索.