编辑:
非常感谢您的帮助!但我的代码中的某个地方仍然存在问题。
我定义了一个C++类SharedConstants,它包含一个Q_PROPERTY QString值并定义一个Q_ENUM枚举。我发现可以从 main.qml 访问 QString 值和枚举值 - 但不能同时访问两者。特别是如果我“注册”C++ 类,QML 可以访问枚举值,但不能访问 QString。 所以我仍然缺少一些东西,但是什么呢? 这是我的 C++ 课程:
/// Constants shared between C++ and QML code
class SharedConstants : public QObject
{
Q_OBJECT
public:
enum EditState {
Unknown,
Pointing,
EditRoute,
EditPoints,
EditOverlay
};
Q_ENUM(EditState)
/// Define read-only QString property called "testString"
Q_PROPERTY(QString testString READ getTestString)
/// Just return a dummy string for now...
QString getTestString() const {
std::cout << "**** getTestString()\n";
return QString("Dummy value");
}
};
这是我的 QML:
import SharedConstants 1.0
ApplicationWindow {
[...]
property int editState: SharedConstants.EditRoute // This is value of 2
property string testString: SharedConstants.testString
Component.onCompleted: {console.log("onCompleted");
console.log("editState: ", editState);
console.log("testString: ", testString)}
所以我希望当我运行应用程序时,editState = 2,并且 testString =“虚拟值”。本文档
表示如果要从 QML 访问某个类的枚举值,则必须注册该类。是的,我发现如果我注册 SharedConstant,即在 main.cpp 中,可以从 QML 访问 SharedConstants.EditState 枚举值:
qmlRegisterType<SharedConstants>("SharedConstants", 1, 0,
"SharedConstants");
但是从 QML 访问时,Q_PROPERTY QString testString 为空/空:
qml:编辑状态:2 qml:测试字符串:
我发现,如果我将 SharedConstant 实例设置为上下文属性而不是注册它,那么 QML
can 可以从 QML 访问 testString - 即在 main.cpp 中:
SharedConstants constants;
engine.rootContext()->setContextProperty("SharedConstants", &constants);
但在这种情况下,QML 会看到所有 SharedConstants.EditState 枚举值 0,正如文档中所预期的那样。
qml:编辑状态:0 qml: testString: 虚拟值
所以我不知道为什么 QML 可以看到我注册的 C++ 类枚举值,但看不到它的 Q_PROPERTY 值...非常感谢所有帮助!
setContextProperty("SharedConstants", &constants)
表示您要从 QML 代码访问
constants
。该对象是在 C++ 端创建的。qmlRegisterType<SharedConstants>("SharedConstants", 1, 0, "SharedConstants")
表示您希望 QML 使用您在 C++ 中定义的类型。因此,在 QML 中创建
testString
类型的对象之前,您无法在 QML 端读取属性(成员变量)SharedConstants
。qmlRegisterType<SharedConstants>("SharedConstants", 1, 0,
"SharedConstants");
import SharedConstants 1.0
ApplicationWindow {
[...]
SharedConstants {
id: constantObject
}
Component.onCompleted: {
console.log("onCompleted");
// Get enum value defined in @SharedConstatns type
console.log("editState: ", SharedConstants.EditRoute);
// Get property of the object @constantObject
console.log("testString: ", constantObject.testString)}