首页 > 解决方案 > 如何将现有的 Q_PROPERTY 重新定义为 REQUIRED?

问题描述

目标

我有一个QQuickItem派生的 C++ 类,Foo并且我想确保在 QML 中使用它的任何人都会为该objectName属性赋予一个值。在Foo我重新定义这样的属性:

Q_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged REQUIRED)

由于objectNameChanged不采用零参数,因此仅此一项就会导致错误。所以我还需要添加一个信号Foo

void objectNameChanged();

然后它编译没有错误。

问题

文档指出:

在 QML 中,除非设置了所有 REQUIRED 属性,否则无法实例化具有 REQUIRED 属性的类。

但是,当我在 QML 中这样使用它时:

Foo {
    // objectName: qsTr("test) <-- commented line
}

该程序编译并运行没有错误。

问题

有没有办法将objectName或任何其他现有属性更改为required

标签: c++qtqmlqt5

解决方案


您可以做的是公开一个 qml 文件 Foo.qml ,其中包含

CppFoo {
    required objectName
}

而不是将 C++ 类直接暴露给您的用户。例如,使用一个简单的 Item 执行此操作,然后在另一个文件中使用它会导致类似的错误

file:///tmp/tmp.aOQi2yetXl/Foo.qml:3 Required property objectName was not initialized

Q_PROPERTY(QString objectName READ objectName WRITE setObjectName NOTIFY objectNameChanged REQUIRED)不起作用的事实 可能是引擎中的错误。而且目前 C++ API 中没有根据需要标记父类的属性的功能。


推荐阅读