当前位置:  开发笔记 > 编程语言 > 正文

我们如何只在qml中进行枚举声明,而不是javascript?

如何解决《我们如何只在qml中进行枚举声明,而不是javascript?》经验,为你挑选了3个好方法。

我的问题是如何在qml中定义枚举器?或者我们可以在qml中用c ++定义一个对象相同的枚举?对象枚举如下面的源代码,我想在qt中执行此操作而不是在Qt中使用javascript,我该怎么办?谢谢你的答复,

enum Color { RED, GREEN, BLUE };
Color r = RED;
switch(r)
{
    case RED  : std::cout << "red\n";   break;
    case GREEN: std::cout << "green\n"; break;
    case BLUE : std::cout << "blue\n";  break;
}

我想知道Qml有能力定义枚举吗?谢谢你的答复



1> Paul Masri-S..:

从Qt 5.10开始,QML直接支持枚举.请参阅包含示例代码的Qt文档.

您可以使用enum关键字定义一个.该类型和它的价值必须以大写字母否则遵循规则来命名一个变量(例如可以包括数字和下划线).

要使用枚举,您必须明确包含包括组件在内的完整范围ComponentName.EnumType.EnumValue.即使在组件本身内使用它也是如此.

例如

// MyComponent.qml
Rectangle {
    id: root

    // Define Shape enum
    enum Shape {
        None,
        Round,
        Pointy,
        Bobbly,
        Elusive
    }

    // Note: property using enum is of type int
    property int selectedShape: MyComponent.Shape.None

    visible: selectedShape !== MyComponent.Shape.None
    color: selectedShape === MyComponent.Shape.Pointy? "red": "green"
}

请注意,枚举值被视为int,您可以分配和比较它们.

虽然没有记录(因此可能会有变化),但默认情况下第一个有值0,第二个1等.但是你可以指定一个非负整数值.您甚至可以将两个枚举值分配给相同的整数值,尽管这可能不是一个好主意.您不能指定计算结果为整数的表达式.

例如

enum Shape {
    None = 5, // valid
    Round, // automatically assigned 6
    Pointy = -1, // not valid
    Bobbly = Round // not valid
    Elusive = (8-7) // not valid
}

感谢Michael Brasser关于分配简单值的博客评论.



2> Miguel El Me..:

您可以使用纯Qml单例,因此您不需要任何C++或javascript.

颜色/ MyColors.qml:

pragma Singleton
import QtQuick 2.5
QtObject {
    id: singleton

    property int red: 0
    property int green: 1
    property int blue: 2
}

颜色/ qmldir:

singleton MyColors 1.0 MyColors.qml

你的qml文件:

import "colors" 1.0
// MyColors.red
// MyColors.green
// MyColors.blue


也许更好地使用`readonly`属性?
仅附带说明,属性不能以大写字母开头。

3> Simon Warta..:

首先,使用enum class而不是enum为了更好的类型安全

enum class Color { RED, GREEN, BLUE };
Color r = Color::RED;

然后使用Q_ENUMSQ_ENUM用于Qt 5.5+)将其注册为Qt :

mycolors.h

#pragma once

#include 

class MyColors : public QObject
{
    Q_OBJECT

public:
    enum class Color {
        RED,
        GREEN,
        BLUE
    };
    Q_ENUMS(Color)

    static void init();
};

要使该枚举在QML中可用,请对其进行注册(在mycolors.cpp文件中):

void MyColors::init()
{
    qRegisterMetaType("MyColors::Color");
    qmlRegisterType("MyQmlModule", 1, 0, "MyColors");
}

并致电给Colors::init()main()

在QML中,您现在有了

import MyQmlModule 1.0

// MyColors.RED
// MyColors.GREEN
// MyColors.BLUE

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有