web-dev-qa-db-ja.com

JavaScriptを使用せずにQMLで列挙型を宣言するにはどうすればよいですか?

QMLでは列挙型を定義できますか?もしそうなら、どのようにQMLで列挙を宣言できますか?

次のC++列挙型のように、列挙型をQMLで宣言したいと思います。できれば、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;
}

私は何をすべきか?

15
user4569486

純粋なQmlシングルトンを使用できるため、C++やJavaScriptは必要ありません。

colors/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
14

Qt 5.10以降、列挙型はQMLで直接サポートされています。 サンプルコードを含むQtドキュメントを参照してください。

enumキーワードを使用して定義できます。 typeおよびそのvaluesは大文字で始まる必要がありますが、それ以外の場合は変数の命名規則(たとえば、数字やアンダースコアを含めることができます)。

列挙型を使用するには、コンポーネント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、2番目の値は1などです。ただし、負でない整数値を割り当てることができます。 2つの列挙値を同じ整数値に割り当てることもできますが、これはおそらくお勧めできません。整数に評価される式を割り当てることはできません。

例えば.

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

ありがとう Michael Brasserのシンプルな値の割り当てに関するブログのコメント

21

まず、型の安全性を高めるために、enumではなく_enum class_を使用します

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

次に、_Q_ENUMS_を使用してQtに登録します(Qt 5.5以降の場合は_Q_ENUM_を使用します):

mycolors.h

_#pragma once

#include <QObject>

class MyColors : public QObject
{
    Q_OBJECT

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

    static void init();
};
_

EnumをQMLで使用できるようにするには、それを(mycolors.cppファイルに)登録します。

_void MyColors::init()
{
    qRegisterMetaType<MyColors::Color>("MyColors::Color");
    qmlRegisterType<MyColors>("MyQmlModule", 1, 0, "MyColors");
}
_

Colors::init()main()を呼び出します。

QMLでは、

_import MyQmlModule 1.0

// MyColors.RED
// MyColors.GREEN
// MyColors.BLUE
_
8
Simon Warta

Qt 5.10以降、EnumタイプをQMLで直接宣言することもできます: https://v-play.net/updates/v-play-2-15-0-qt-5-10-qt-creator -4-5-support-firebase-data-structures-and-queries#qt-5-10-qml-enum-instanceof

// MyText.qml
import QtQuick 2.0

Text {
  enum MyEnum {
    Normal,
    Heading
  }

  property int textType: MyText.MyEnum.Normal

  font.bold: textType == MyText.MyEnum.Heading
  font.pixelSize: textType == MyText.MyEnum.Heading ? 24 : 12
}

// Main.qml
import VPlayApps 1.0

App {
  MyText {
    textType: MyText.MyEnum.Heading
    text: "I'm a headline."
  }
}
3
user5315753