簡體   English   中英

有沒有辦法使用QMetaEnum和Q_ENUMS屬於非Q_OBJECT或Q_GADGET類?

[英]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將打印值的名稱而不是數字。
  • 當放入QVarianttoString()給出值名稱。 值名稱由QCOMPARE打印(自Qt 5.6起)

取自關於該主題的WOBOQ博客文章 ,請閱讀有關Q_ENUMQ_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM