我一直在尝试实现一些我认为应该非常简单的东西,但是遇到了问题。简而言之,我有一个包含一些 的类,其中Q_Properties
一些我想成为命名空间级别的enum
值。我的问题是,如果我将enum
其移动namespace
到单独的文件中,QProperty
系统将无法识别该属性是一个enum
值。
这是一个精简的版本来说明:
一个文件包含一个带有枚举的命名空间以及我尝试与枚举一起使用的类:
#ifndef ENUMPROPERTYTEST_H
#define ENUMPROPERTYTEST_H
#include <QObject>
#include "enumTest.h" //contains the other namespace and enum I want to use
namespace Test_SameFile {
Q_NAMESPACE
enum NSEnum_SameFile {
A1,
A2,
A3
};
Q_ENUM_NS(NSEnum_SameFile)
}
class EnumPropertyTest : public QObject
{
Q_OBJECT
Q_PROPERTY(int INT1 MEMBER myInt)
//this enum is declared in the same file and works as expected
Q_PROPERTY(Test_SameFile::NSEnum_SameFile ENUMVAL1 MEMBER a)
//this enum is declared in a separate header file and does not
Q_PROPERTY(Test_DiffFile::NSEnum_DiffFile ENUMVAL2 MEMBER g)
public:
explicit EnumPropertyTest() : QObject() {}
~EnumPropertyTest() {}
private:
int myInt = 5;
Test_SameFile::NSEnum_SameFile a = Test_SameFile::A2;
Test_DiffFile::NSEnum_DiffFile g = Test_DiffFile::T2;
};
#endif // ENUMPROPERTYTEST_H
我的头文件包含另一个命名空间和枚举:
#ifndef ENUMTEST_H
#define ENUMTEST_H
#include <QObject>
namespace Test_DiffFile {
Q_NAMESPACE
enum NSEnum_DiffFile {
T1,
T2,
T3
};
Q_ENUM_NS(NSEnum_DiffFile)
}
#endif // ENUMTEST_H
我的主要:
#include <QObject>
#include <QMetaProperty>
#include <QDebug>
#include "enumpropertytest.h"
int main()
{
auto id1 = qRegisterMetaType<Test_SameFile::NSEnum_SameFile>();
auto id2 = qRegisterMetaType<Test_DiffFile::NSEnum_DiffFile>();
auto e1 = QMetaEnum::fromType<Test_SameFile::NSEnum_SameFile>();
qDebug() << "e1 id: " << id1 << ", valid:" << e1.isValid() << ", scope : " << e1.scope();
auto e2 = QMetaEnum::fromType<Test_DiffFile::NSEnum_DiffFile>();
qDebug() << "e2 id: " << id2 << ", valid:" << e2.isValid() << ", scope : " << e2.scope();
EnumPropertyTest t;
auto mo = t.metaObject();
for (int i = mo->propertyOffset(); i < mo->propertyCount(); ++i){
QString propName = mo->property(i).name();
auto prop = mo->property(i);
qDebug() << "Property: " << propName << "is an enum: " << prop.isEnumType();
}
return 0;
}
当我运行这个程序时,它输出以下内容:
e1 id: 1024 , valid: true , scope : Test_SameFile
e2 id: 1025 , valid: true , scope : Test_DiffFile
Property: "INT1" is an enum: false
Property: "ENUMVAL1" is an enum: true
Property: "ENUMVAL2" is an enum: false
如您所见,在与类相同的文件中声明的枚举在属性系统中按预期工作,但在头文件中声明的枚举未被识别为枚举。我该如何解决这个问题?我已经删除了构建文件夹,重新运行qmake
,我能想到的一切都很明显,没有任何变化。