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ế:
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
đ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. –