[英]Is there a way to use QMetaEnum with Q_ENUMS belonging to non Q_OBJECT or Q_GADGET class?
例如,我有以下課程:
namespace someName
{
class someClass
{
Q_ENUMS(ESomeEnum)
public:
enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};
// ... some other things ..
}
}
Q_DECLARE_METATYPE(someName::someClass)
有沒有辦法使用QMetaEnum :: valueToKey或QMetaEnum :: keyToValue?
嘗試了這個答案中的方法,但得到以下錯誤:
error: static assertion failed: QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG #define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)
我可以使用X-Macros來獲得我想要的輸出,但是在Qt中學習更多技巧也會很好。
不,沒有,因為Q_ENUM
的功能是在moc生成的代碼中實現的,而moc忽略了既不是Q_OBJECT
也不是Q_GADGET
。 沒有理由不使用Q_GADGET
因為它對對象大小沒有影響:不添加虛擬方法也不添加數據字段。
以下說明了這一點:
#include <QtCore>
namespace Ns {
class Class {
Q_GADGET
public:
enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};
Q_ENUM(ESomeEnum)
};
}
int main() {
auto metaEnum = QMetaEnum::fromType<Ns::Class::ESomeEnum>();
qDebug() << sizeof(Ns::Class) << metaEnum.valueToKey(Ns::Class::ENUM_A);
}
#include "main.moc"
輸出:
1 ENUM_A
在這個特定的平台(以及許多其他平台)上,空類的大小為1。
Q_ENUM
就像舊的Q_ENUMS
但有以下差異:
enum
之后。 enum
可以放在宏中。 QMetaEnum::fromType<T>()
。 enum
自動聲明為QMetaType
(不再需要在Q_DECLARE_METATYPE
添加它們)。 qDebug
enum
將打印值的名稱而不是數字。 QVariant
, toString()
給出值名稱。 值名稱由QCOMPARE
打印(自Qt 5.6起) 取自關於該主題的WOBOQ博客文章 ,請閱讀有關Q_ENUM
與Q_ENUMS
其他信息。
是的,自5.8以來你可以這樣做:
namespace MyLibrary
{
Q_NAMESPACE
enum class MYLIBRARYSHARED_EXPORT MyEnumClass
{
...
};
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.