我的问题是如何在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;
}
Run Code Online (Sandbox Code Playgroud)
我想知道Qml有能力定义枚举吗?谢谢你的答复
Pau*_*one 21
从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"
}
Run Code Online (Sandbox Code Playgroud)
请注意,枚举值被视为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
}
Run Code Online (Sandbox Code Playgroud)
感谢Michael Brasser关于分配简单值的博客评论.
Mig*_*ero 14
您可以使用纯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
}
Run Code Online (Sandbox Code Playgroud)
颜色/ qmldir:
singleton MyColors 1.0 MyColors.qml
Run Code Online (Sandbox Code Playgroud)
你的qml文件:
import "colors" 1.0
// MyColors.red
// MyColors.green
// MyColors.blue
Run Code Online (Sandbox Code Playgroud)
首先,使用enum class
而不是enum
为了更好的类型安全
enum class Color { RED, GREEN, BLUE };
Color r = Color::RED;
Run Code Online (Sandbox Code Playgroud)
然后使用Q_ENUMS
(Q_ENUM
用于Qt 5.5+)将其注册为Qt :
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();
};
Run Code Online (Sandbox Code Playgroud)
要使该枚举在QML中可用,请对其进行注册(在mycolors.cpp文件中):
void MyColors::init()
{
qRegisterMetaType<MyColors::Color>("MyColors::Color");
qmlRegisterType<MyColors>("MyQmlModule", 1, 0, "MyColors");
}
Run Code Online (Sandbox Code Playgroud)
并致电给Colors::init()
您main()
。
在QML中,您现在有了
import MyQmlModule 1.0
// MyColors.RED
// MyColors.GREEN
// MyColors.BLUE
Run Code Online (Sandbox Code Playgroud)
小智 6
从 Qt 5.10 开始,您现在还可以直接在 QML 中声明 Enum 类型: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."
}
}
Run Code Online (Sandbox Code Playgroud)