Evgenii Legotckoi
Evgenii Legotckoi15. Dezember 2017 04:02

QML - Tutorial 035. Verwendung von Aufzählungen in QML ohne C ++

Nun, es ist endlich da!!! Jetzt ist es möglich, Aufzählungen (enum) sofort in QML zu deklarieren, ohne mit C++ zu tanzen. In diesem Artikel habe ich beschrieben, wie ich meine Enumerationen über C++ zu QML hinzufüge . Tatsächlich gibt es hier von der C++-Seite nichts Kompliziertes, Sie müssen nur eine von QObject geerbte Klasse schreiben und Ihre Aufzählung in dieser Klasse über Q_ENUM oder Q_ENUMS registrieren und die Klasse über qmlRegisterType. registrieren.

Q_ENUM wurde in Qt 5.5 hinzugefügt, um Q_ENUMS zu ersetzen, und ermöglicht es Ihnen, QMetaEnum zur Kompilierzeit mit QMetaEnum::fromType zu erhalten . Solche Enums werden nun automatisch als Metatypen registriert und können in QVariant in Strings umgewandelt oder mit qDebug() als String ausgegeben werden.

Allerdings funktioniert nach meinen Beobachtungen bei der Registrierung von Aufzählungen über Q_ENUM in QML-Dateien in Qt Creator die Codevervollständigung für diese Aufzählungen nicht, während bei der Registrierung über Q_ENUMS alles funktioniert.

Aber jetzt ist es möglich, die Aufzählung direkt in Ihren benutzerdefinierten QML-Typ zu schreiben.

Lassen Sie uns beispielsweise diesen Objekttyp in QML erstellen.

MeinText.qml

import QtQuick 2.10

Text {
    enum MyEnum {
        First = 10,
        Second
    }

    anchors.centerIn: parent
}

Dann kann es in main.qml wie folgt verwendet werden

main.qml

import QtQuick 2.10
import QtQuick.Window 2.10

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    MyText {
        text: MyText.MyEnum.Second
    }
}

Die Nummer 11 wird auf dem Bildschirm angezeigt

Wie Sie sehen können, sieht die Syntax für den Zugriff auf eine Aufzählung wie folgt aus.

<Name des QML-Objekttyps> * . <Enum-Name> . <Enum-Mitgliedsname>**

Und es spielt keine Rolle, ob Sie diese Aufzählung innerhalb oder außerhalb des Typs verwenden. Das heißt, die Verwendung innerhalb des Typs dieser Aufzählung sieht folgendermaßen aus.

import QtQuick 2.10

Text {
    enum MyEnum {
        First = 10,
        Second
    }

    anchors.centerIn: parent
    text: MyText.MyEnum.Second
}

AUFMERKSAMKEIT!!! - Die folgende Option funktioniert nicht

import QtQuick 2.10

Text {
    enum MyEnum {
        First = 10,
        Second
    }

    anchors.centerIn: parent
    text: MyEnum.Second
}

Das heißt, selbst innerhalb eines benutzerdefinierten Typs müssen Sie auf die Aufzählung dieses Typs über seinen Namen zugreifen, d. h. den Namen der QML-Datei.

Ich mache Sie darauf aufmerksam, dass aus Sicht der Organisation von Programmen in QML jede QML-Datei ein QML-Typ ist, d. h. ein eigenständiges Objekt, das von der QObject-Klasse auf C++-Ebene in der geerbt wird Vererbungshierarchie.

Außerdem werden die folgenden Optionen zum Deklarieren von Enums leider noch nicht unterstützt.

enum MyEnum {
    First = -1,     
    Second
}

enum MySecondEnum {
    First,     
    Second = First
}

Unter anderem unterstützt Qt Creator 4.5.0, das zum Zeitpunkt des Schreibens aktuell ist, noch kein Enum-Syntax-Highlighting in QML. Die Aufzählungen selbst funktionieren jedoch.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

m
  • 20. Juni 2022 08:26

А как правильно зарегистрировать C++ enum, допустим

enum CppEnumType {
 Foo,
 Bar
};

чтобы использовать его в QML как

property CppEnumType: CppEnumType.Foo

У меня никак не получается тип проперти сделать enum из C++, только как int

Evgenii Legotckoi
  • 21. Juni 2022 03:09

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken