2014-04-07 5 views
1

QML에서 사용하기 위해 QFlags를 내보내려고했지만 (주로 QML로 노출 된 객체의 속성에서 읽으려고했습니다), 계속해서 this SO question을 계속합니다. 점점 컴파일러 오류 :QML (Qt 5)로 QFlags 내보내기 - staticMetaObject에서 오류가 발생했습니다.

#ifndef HOLIDAYACTIVITIES_H 
#define HOLIDAYACTIVITIES_H 

#include <QObject> 
#include <QMetaType> 
#include <QPair> 
#include <QObject> 
#include <QDateTime> 
#include <QGeoLocation> 


namespace HolidayPlanner 
{ 

class Holiday: public QObject { 
    Q_OBJECT 

    Q_ENUMS(ActivityType) 
    Q_ENUMS(TransportType) 

public: 
    explicit Holiday(QObject* parent = 0); 
    virtual ~Holiday(); 

    enum ActivityType { 
     Transportation = 1, 
     Lodging = 2, 
     Sights = 4, 
     Note = 8, 
     Food = 16 
    }; 

    enum TransportType { 
     Flight = 1, 
     Train = 2, 
     Subway = 4, 
     Bus = 8, 
     Foot = 16, 
     Other = 32, 
     None = 64 
    }; 

    enum ItemRole { 
     TypeRole = Qt::UserRole + 1000, 
     StartDateRole = Qt::UserRole + 1001, 
     EndDateRole = Qt::UserRole + 1002, 
     StartPositionRole = Qt::UserRole + 1003, 
     EndPositionRole = Qt::UserRole + 1004, 
     TaskRole = Qt::UserRole + 1005, 
    }; 

    Q_DECLARE_FLAGS(ActivityTypes, ActivityType) 
    Q_FLAGS(ActivityTypes) 
    Q_DECLARE_FLAGS(TransportTypes, TransportType) 
    Q_FLAGS(ActivityTypes) 

}; 


Q_DECLARE_OPERATORS_FOR_FLAGS(Holiday::ActivityTypes) 
Q_DECLARE_OPERATORS_FOR_FLAGS(Holiday::TransportTypes) 

}; // namespace HolidayPlanner 

Q_DECLARE_METATYPE(HolidayPlanner::Holiday::ActivityType) 
Q_DECLARE_METATYPE(HolidayPlanner::Holiday::TransportType) 

하지만 코드에서

qmlRegisterType<HolidayPlanner::Holiday::ActivityType>(); 

어디서나 실행할 때, 나는

In file included from /usr/include/qt5/QtQml/QtQml:9:0, 
      from /home/lb/Coding/cpp/holiday-planner/src/holidayactivities.cpp:21: 
/usr/include/qt5/QtQml/qqml.h: In instantiation of ‘int qmlRegisterType() [with T =  
HolidayPlanner::Holiday::ActivityType]’: 
/home/lb/Coding/cpp/holiday-planner/src/holidayactivities.cpp:28:60: required from here 
/usr/include/qt5/QtQml/qqml.h:109:5: error: ‘staticMetaObject’ is not a member of  
‘HolidayPlanner::Holiday::ActivityType’ 
    QML_GETTYPENAMES 
    ^
/usr/include/qt5/QtQml/qqml.h:119:21: error: ‘staticMetaObject’ is not a member of 
‘HolidayPlanner::Holiday::ActivityType’ 
    0, 0, 0, 0, &T::staticMetaObject, 
       ^
를 얻을 수

무엇이 잘못되었을 수 있습니까?

참고로 QLocale과 같은 다른 클래스는 열거 형을 QML로 내보낼 수 있습니다 (기본적으로 완료되지는 않지만 작동합니다). 그러나 제 경우에는 작동하지 않는 이유에 대한 단서를 찾을 수 없습니다.

+0

어디에서 HolidayPlanner 클래스를 등록합니까? 나는 그것을 볼 수 없다. – lpapp

답변

2

qml 유형으로 enum을 등록 할 수 없습니다. qmlRegisterType<T>() 함수는 QObject에서 파생 된 클래스에만 적용됩니다. enumus 등록 AFAIK 필요하지 않습니다. 그들은 정상적인 int로 취급됩니다.

QObject에서 파생되지 않는 다른 모든 유형을 qml에 QVariant 내에서 전달하려면 qRegisterMetaType<T>을 사용하십시오. qml에서는 직접 사용할 수 없지만 C++ 슬롯, 속성 및 호출 가능한 메서드에 전달할 수 있습니다.

+0

다른 객체의 속성으로 액세스 할 것이므로 등록해야합니다 (다른 SO 질문과 관련되어 있음). – Einar

+0

@Einar qRegisterMetaType 을 아직 사용해 보지 않으셨습니까? – Arpegius

+0

@Arpegus 현재 코드에 액세스 할 수 없지만, 오늘 저녁에 시도 할 것입니다. – Einar

1

아마도 올바르게 수행하지 않을 것입니다. 열거 형을 등록한 클래스를 등록해야합니다. 그러면 자동으로 열립니다. 이 같은

class MyClass : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(MyEnum) 
    Q_PROPERTY(MyEnum myEnum READ myEnum) 

public: 
    enum MyEnum { 
     Value1 = 0, 
     Value2 
    }; 

    explicit MyObject(QObject *parent = 0); 

    MyEnum myEnum() const; 

    Q_INVOKABLE MyEnum getMyEnum() const; 
}; 

qmlRegisterType<MyClass>("myclass", 1, 0, "MyClass"); 

특정 사건에 대한이를 해석하려면 작성 될 것을 : 다음

qmlRegisterType<Holiday>("holiday", 1, 0, "Holiday"); 

당신은 QML에서 열거 형 값에 액세스, 여기가 일반적으로가는 방법의 예입니다 like :

holiday.Transportation 
+0

저자는 QFlag를 QML이 아닌 Enum으로 노출하도록 요청합니다. 이것은 동일하지 않습니다. – rightaway717

관련 문제