2014-09-11 14 views
6

This documentation bangKhông thể tuyên bố Q_ENUM từ một enum định nghĩa trong lớp khác

Nếu bạn muốn đăng ký một enum được khai báo trong lớp khác, enum phải có đủ điều kiện với tên của Định nghĩa lớp nó. Ngoài ra, lớp xác định enum phải kế thừa QObject cũng như khai báo enum bằng Q_ENUMS().

Tuy nhiên, tôi không thể thực hiện công việc này trong ví dụ sau.

Class A:

#ifndef CLASSA_H 
#define CLASSA_H 

#include <classb.h> 

class ClassA : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(ClassB::TestEnum) 

public: 
    explicit ClassA(QObject *parent = 0) : QObject(parent) 
    { 
     const QMetaObject *metaObj = this->metaObject(); 
     qDebug() << metaObj->enumeratorCount(); 
    } 
}; 

#endif // CLASSA_H 

ClassB:

#ifndef CLASSB_H 
#define CLASSB_H 

#include <QDebug> 
#include <QMetaEnum> 
#include <QObject> 

class ClassB : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(TestEnum) 

public: 
    enum TestEnum { A, B, C }; 

    explicit ClassB(QObject *parent = 0) : QObject(parent) 
    { 
     const QMetaObject *metaObj = this->metaObject(); 
     qDebug() << metaObj->enumeratorCount(); 
    } 
}; 

#endif // CLASSB_H 

chính:

#include <classa.h> 
#include <classb.h> 

int main() 
{ 
    ClassA objectA; 
    ClassB objectB; 
} 

Dự kiến ​​sản lượng:

Output Thực tế:

+0

Các trạng thái tài liệu này một lần thứ hai với ví dụ: "Phải chăng kiểu enumeration được khai báo trong lớp khác, tên đầy đủ của nó (ví dụ, OtherClass :: Ưu tiên) sẽ được yêu cầu, và lớp khác cũng sẽ phải kế thừa QObject và đăng ký kiểu liệt kê ở đó bằng cách sử dụng macro Q_ENUMS(). " Có thể là một lỗi? Bạn không nhận được bất kỳ cảnh báo hoặc lỗi nào của MOC? – Silicomancer

+0

điều này là không cần thiết. Khi bạn có dữ liệu meta cho liệt kê này trong lớp 'LớpB', dữ liệu meta này có thể được sử dụng ở bất cứ đâu, bạn không phải tạo lại dữ liệu meta trong một lớp khác. –

Trả lời

5

Dưới đây là một bản tóm tắt của một nghiên cứu nhỏ:

  • Thông tin được nêu trong tài liệu hướng dẫn về đăng ký một enum tuyên bố trong lớp khác có vẻ lỗi thời.

  • Q_ENUMS(Class::EnumName không tạo một điều tra viên mới và vô ích.

  • Khi bạn khai báo Q_PROPERTY mới trong ClassA, bạn nên sử dụng dạng đầy đủ của enum ClassB::EnumName.

  • Ngay sau khi EnumName được đăng ký trong ClassB, bạn không cần phải đăng ký thêm nữa.

  • Thuộc tính được tạo bằng cách sử dụng điều tra từ một lớp khác hoạt động chính xác.

    class ClassA : public QObject 
    { 
    public: 
    Q_OBJECT  
    Q_PROPERTY(ClassB::TestEnum test READ test) 
    
    public: 
    explicit ClassA(QObject *parent = 0) 
    { 
        const QMetaObject *metaObj = this->metaObject(); 
        qDebug() << metaObj->enumeratorCount(); 
    
        QMetaProperty property = metaObj->property(metaObj->indexOfProperty("test")); 
        if (property.isEnumType()) 
        { 
         const QMetaEnum& enumerator = property.enumerator(); 
    
         qDebug() << enumerator.name(); 
    
         for (int i = 0 ; i < enumerator.keyCount(); i++) 
         { 
          qDebug() << QLatin1String(enumerator.key(i)) << enumerator.value(i);   
         } 
        } 
    } 
    ClassB::TestEnum test() const 
    { 
        return ClassB::A; 
    } 
    }; 
    

Output:

0 
TestEnum 
"A" 0 
"B" 1 
"C" 2 
+3

Có thể bạn nên báo cáo tài liệu này không nhất quán với trình theo dõi lỗi Qt. – Silicomancer

+4

Xong. https: //bugreports.qt-project.org/duyệt/QTBUG-41272 – Ezee

Các vấn đề liên quan