2015-12-25 5 views
2

мой вопрос как мы можем определить перечислитель в qml? Или мы можем определить объект же перечисление в C++ в qml? перечисление объекта, как ниже источника, я хочу сделать это в qml, а не в javascript в Qt, что мне делать? спасибо за ответ,как мы можем сделать объявление перечисления только в 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 имеет способность, определяющую перечисление в нем? спасибо за ответ

ответ

8

Вы можете использовать чистый 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 
+0

спасибо за ответ –

+0

Просто боковое примечание, свойства не могут начинаться с буквы верхнего регистра. – Silex

+1

@ Силекс, вы правы, я исправил ответ. –

3

Во-первых, использовать enum class вместо enum для лучшей безопасности типа

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

Затем зарегистрировать его для Qt с помощью Q_ENUMS (используйте Q_ENUM для Qt 5.5+):

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(); 
}; 

Чтобы сделать перечисление доступным в 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 
+0

спасибо большое –

1

Начиная с Qt 5.10, теперь вы можете также объявить типы перечислений непосредственно в 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." 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^