gpt4 book ai didi

c++ - QML:QQmlListProperty。 T 必须是 QObject 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:21:17 25 4
gpt4 key购买 nike

在文档中明确指出,具有列表的C++类必须继承自QObject,但不清楚列表中的对象是否必须是QObjects。
我试过this使用 QQmlListProperty 和 QQmlListProperty 的方法,但在这两种情况下我都会遇到以下错误:

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

编辑:我的代码:

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

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

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

此外,在我的 ma​​in 中,在将 qml 文件加载到 QQmlApplicationEngine 之前:

qmlRegisterType<ns::Status>("Foo", 1,0, "Status");

最佳答案

QQmlListProperty 确实要与 QObject 一起使用。

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

QQmlListReference 的文档中可以找到 Qt 文档中的说明(一个用于从 c++ 操作 QQmlListProperty 的类)。本段提到 QObject :

QML list properties are type-safe. Only QObject's that derive from the correct base class can be assigned to the list. The listElementType() method can be used to query the QMetaObject of the QObject type supported. Attempting to add objects of the incorrect type to a list property will fail.

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

关于c++ - QML:QQmlListProperty<T>。 T 必须是 QObject 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com