无法在QML中直接使用枚举项,需要使用属性

时间:2015-11-24 13:40:10

标签: qt enums qml

使用Qt Quick 2.0,QT 5,一个(生成的)充满枚举的类将在GUI中使用。 班级已正确注册。无法在QML代码中直接使用枚举项,例如 在console.logswitch ... case中,他们总是评估为undefined。 将枚举分配给property int DOES工作,并给出预期值。 为什么?如何直接使用枚举,而不复制所有枚举(数百) 属性?

guiids.h:

#include <QObject>
class GuiIDs : public QObject
{
    Q_OBJECT
    // ...
    Q_ENUMS(Element_ALARMSTATUS_t)
    // ...
public:
    // ...
    enum Element_ALARMSTATUS_t {
        status_ALARMSTATUS_HIDDEN,
        status_ALARMSTATUS_NOALARM,
        status_ALARMSTATUS_INFO,
        status_ALARMSTATUS_ALARM,
        status_ALARMSTATUS_ACKNOWLEDGED,
        status_ALARMSTATUS_PAUSED,
        element_ALARMSTATUS_COUNT
    };
    // ...
};

test.qml:

import QtQuick 2.0
import bla.bla.bla.guiids 1.0
Rectangle {
    // ...
    Rectangle {
        x: 0
        y: 0
        width: 100
        height: 100
        color: "red"
        MouseArea {
            anchors.fill: parent
            property int foo: GuiIDs.element_ALARMSTATUS_COUNT
            onClicked: {
                // ...
                console.log("foo=",foo);
                console.log("GuiIDs.element_ALARMSTATUS_COUNT=",GuiIDs.element_ALARMSTATUS_COUNT)
            }
        }
    }
}

单击红色矩形后记录输出:

qml: foo= 6
qml: GuiIDs.element_ALARMSTATUS_COUNT= undefined

1 个答案:

答案 0 :(得分:-1)

enum封装到QObject中,就像我一样 - 例如来自我的代码:

#ifndef UEMOBILEDATACONNECTION
#define UEMOBILEDATACONNECTION

#include <QObject>

class UeMobileDataConnection : public QObject
{
    Q_OBJECT

public:
    enum UeTypeMobileDataConnection
    {
        NOT_CONNECTED=false,
        CONNECTED=true
    };

    Q_ENUM(UeTypeMobileDataConnection)
};

#endif // UEMOBILEDATACONNECTION

然后注册类型 - 我的代码示例:

qmlRegisterUncreatableType<UeMobileDataConnection>("si.testapp",
                                                   1,
                                                   0,
                                                   "UeTypeMobileDataConnection",
                                                   "Mobile Data Connection Status");

并在QML方面使用它。