2016-09-26 2 views
2

Qt에서 열거 형을 사용하여 QVariant에 팩을 포장하고 QJsonValue 및 이후 JSON으로 변환하도록 어떻게 생각해야하는지 궁금합니다. 내가 열거 형을 선언 결국 워드 프로세서에 따라Qt, QVariant, JSON 및 enums

:

enum BeautifulColors { Red, Green, Blue }; 
Q_DECLARE_METATYPE(BeautifulColors); 

내가 값으로 내 사용자 정의 열거 형을 설정 QVariantsetValue(..)을 사용할 수있는 방법입니다.

문제는 그러나 QJsonValue::fromVariant()이며, 워드 프로세서는 말한다 :

가 QJsonValue에 변형을 변환하고 돌려줍니다. (...) 다른 모든 QVariant 유형의 경우 QString으로의 변환은 이 시도됩니다. 리턴 된 문자열이 비어 있으면 Null QJsonValue는 으로 저장되고, 그렇지 않으면 리턴 된 QString을 사용하는 String 값이 저장됩니다.

QString로 변환하고 실패하고 내 QJsonValue 객체는 null 끝납니다.

다음은 혼동을줍니다. QObject 내에 열거 정의를위한 Q_EUM 매크로가 있습니다. 그러나 QObject는 복사 할 수 없기 때문에 QVariant가 그것을 가지고 있다고 생각하지 않습니다. 확실히 해키가 작동하도록하는 것이 분명하지만, 내가 찾던 것이 아닙니다. 열거 형을 정의하여 데이터 유형으로 사용하고 JSON으로 변환하고 JSON에서 읽을 수 있도록 Qt에서 권장되는 방법은 무엇입니까?

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

는 지금은 일반 ID와 문자열 표현이 있습니다

업데이트

는 다음과 같은 시도!

int idRectangle = qMetaTypeId<Rectangle>(); 

컴파일하지 않고는 생성자가 없기 때문에 나는 Q_DECLARE_MEATYPE에 등록 할 수 없습니다하지만 클래스를 보유합니다. QVariants toString()을 사용하여 모든 클래스에서 작동해야하는 경우 어떻게해야합니까?

내가 지금 (다른) 얻을 열거하고 유지하는 클래스 ID를 입력 Q_GADGET 매크로를 사용하여 두 번째 업데이트

. 그러나 나는 열거 형에 대해서만 여전히 문자열 표현을 얻는다.

답변

2

Q_ENUM 또는 Q_ENUMS은 toString/fromString 기능에 필요한 QMetaEnum 구조를 생성하는 데 필요합니다.

그들은 그들을 처리하고 필요한 코드를 생성 할 moc에 대한 위해 Q_OBJECT 마커 또는 Q_GADGET 마커 모든 클래스에 QObject 파생 클래스에 배치 될 필요가있다.

정의 된 클래스는 열거 형 값을 저장할 때 variant에 저장되는 클래스가 아닙니다. 이 클래스를 enum에 대한 "네임 스페이스"와 같이 생각할 수 있습니다.

+0

들으! – Nils

1

QVariant::toString()을 사용할 수 있도록 나머지는 QVariant가 보유한 유형에 대해 등록해야합니다.

Qt 5.2 (http://log.cedricbonhomme.org/55/66102.html)의 KDAB에서 추가되었지만 doc QVariant::toString()! :(

는 어쨌든 그것은 또한 이것에 대해 Qt를에서 문서에 대한 버그 리포트가있는 경우 다음 예제 출력은 "애플"빠른 답변

enum Fruit { 
    Apple, 
    Pear, 
    Orange 
}; 

Q_DECLARE_METATYPE(Fruit) 

QString Fruit2QString(Fruit fruit) 
{ 
    switch(fruit) 
    { 
     case Apple: 
      return "Apple"; 
     case Pear: 
      return "Pear"; 
     case Orange: 
      return "Orange"; 
    } 

    return "asdf"; 
} 

int main(int argc, char *argv[]) 
{ 
    std::function<QString(Fruit)> f = &Fruit2QString; 
    bool success = QMetaType::registerConverter<Fruit, QString>(f); 
    Q_ASSERT(success); 
    QVariant v; 
    v.setValue(Fruit::Apple); 
    qDebug() << v.toString(); 
} 
+0

확인해 볼 수 있습니다 것입니다, 일반 열거 작동 –

+1

하나를 생성해야 함 : https://bugreports.qt.io/browse/QTBUG-56204 – Nils

+1

구성 요소 "문서"대신보고하는 것이 좋습니다. –