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;
}
私は何をすべきか?
純粋な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
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
}
まず、型の安全性を高めるために、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
_
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."
}
}