QML:QQmlListProperty<T>。T 需要是 QObject 吗?
QML: QQmlListProperty<T>. Does the T need to be a QObject?
文档中明确指出,具有列表的C++类必须继承自QObject,但不清楚列表中的对象是否必须是QObjects。
我已经用QQmlListProperty和QQmlListProperty尝试过这种方法,但是在这两种情况下我都遇到以下错误:
QMetaProperty::read: 无法处理属性 'ns::Status::values' 的未注册数据类型 'QQmlListProperty<QString>
'编辑:我的代码:
.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 }
}
}
另外,在我的主方面,在我将qml文件加载到QQml应用程序引擎之前:
qmlRegisterType<ns::Status>("Foo", 1,0, "Status");
QQmlListProperty
确实是用来QObject
的。尽管类中没有任何内容强制执行此限制,因为它都是模板化的,但 QML 引擎希望元素类型是 QObject 的子类。
Qt文档中的指示可以在QQmlListReference
(一个从c ++操作QQmlListProperty
的类(的文档中找到。 这一段提到QObject
:
QML 列表属性是类型安全的。只有从正确的基类派生的 QObject 才能分配给列表。listElementType(( 方法可用于查询支持的 QObject 类型的 QMetaObject。尝试将不正确类型的对象添加到列表属性将失败。
QObject *QQmlListReference::at(int index) const
方法也是另一个线索。
相关文章:
- EASTL矢量<向量<int>>连续的
- 删除 QSharedPointer 指向的 QObject
- QObject::连接无法将信号连接到*this*对象的插槽
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- QML/C++/QObject Struct Copy
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 具有 QObject 继承的单例 - Qt
- QObject::连接不起作用 - 使用函数语法找不到信号
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 智能指针作为 QObject::d eleteLater() 的替代品
- Shiboken2 qobject.h:46:10:致命:找不到'QtCore/qobjectdefs.h'文件
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- 在另一个线程上发出 QObject 信号的正确方法?
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 在 QObject 方法中生成 QWidgets
- 我可以自动处理继承 QObject 的仅标头对象吗?
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- QObject::connect 有太多的参数