QML 和 C++ 代码之间的定义一致吗?

问题描述 投票:0回答:1

编辑:

非常感谢您的帮助!但我的代码中的某个地方仍然存在问题。

我定义了一个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 值...非常感谢所有帮助!

c++ qt qml
1个回答
0
投票
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)}
© www.soinside.com 2019 - 2024. All rights reserved.