Ich versuche herauszufinden, wie ich Aufzählungen in Qt verwenden soll, damit ich sie in einem QVariant packe und sie in einen QJsonValue und später JSON umwandeln.Qt, QVariant, JSON und enums
die docs Nach ich meine Aufzählungen endete erklärt:
enum BeautifulColors { Red, Green, Blue };
Q_DECLARE_METATYPE(BeautifulColors);
So kann ich setValue(..)
auf QVariant
können meine benutzerdefinierte definiert Aufzählungen als Wert zu setzen. jedoch
Das Problem QJsonValue::fromVariant()
, sagt der docs:
Wandelt Variante zu einem QJsonValue und gibt es zurück. (...) Für alle anderen QVariant-Typen wird eine Konvertierung in einen QString versucht. Wenn der zurückgegebene String leer ist, wird ein Null QJsonValue gespeichert, andernfalls ein String-Wert, der den zurückgegebenen QString verwendet.
Die Umstellung auf QString
versagt und meine QJsonValue
Objekt endet Null zu sein.
Nach der Dokumentation ist weiter verwirrend: Es gibt ein Q_EUM
Makro für die Aufzählung Definition in QObject. Da QObject jedoch nicht kopierfähig ist, glaube ich nicht, dass QVariant es halten soll. Es gibt sicherlich einige Hackies, um es zum Laufen zu bringen, aber das ist nicht das, wonach ich suche. Was ist die empfohlene Vorgehensweise in Qt, Enums zu definieren, damit sie als Datentypen verwendet und in JSON konvertiert und von JSON gelesen werden können?
aktualisieren
versucht, die folgenden:
rectangle.h
#ifndef RECTANGLE_H
#define RECTANGLE_H
#include <QObject>
class Rectangle : public QObject
{
Q_OBJECT
public:
enum Color
{
Red,
Green,
Blue,
};
Q_ENUM(Color)
Rectangle(double x, double y, Color color, QObject *parent = 0);
private:
double _x;
double _y;
Color _color;
};
#endif
rectangle.cpp
#include "rectangle.h"
Rectangle::Rectangle(double x, double y, Rectangle::Color color, QObject *parent)
: QObject(parent)
, _x(x)
, _y(y)
, _color(color)
{
}
main.cpp
#include <QVariant>
#include <QDebug>
#include <QString>
#include "rectangle.h"
int main(int argc, char *argv[])
{
int id = qMetaTypeId<Rectangle::Color>();
Rectangle::Color blueColor = Rectangle::Blue;
QVariant myVariant;
myVariant.setValue(blueColor);
qDebug() << id;
qDebug() << myVariant.toString();
}
nun einen Typ ID und eine String-Darstellung hat es! Aber nicht die Klasse es hält:
int idRectangle = qMetaTypeId<Rectangle>();
lässt sich nicht kompilieren und ich kann es nicht mit Q_DECLARE_MEATYPE
registrieren, weil es keinen Konstruktor hat. Was ist, wenn ich QVariants toString() brauche, um mit jeder Klasse zu arbeiten?
zweite Update
die Q_GADGET Makro jetzt eine (andere) Typ-ID für die ENUM und die Klasse es hält ich. Allerdings bekomme ich immer nur eine String-Repräsentation für die Enumeration.
Thx für die schnelle Antwort! – Nils