私は、その内容がオペレーティングシステムに基づいて変化する列挙型を持っています。だから、私のような何かをしたい:QMetaEnum:定義を使用するには?
QMetaEnum::fromType<AudioRenderer>();
をし、それで物事を実行します。
#ifdef _WIN32
enum AudioRenderer
{
Null,
OpenAL,
XAudio2
};
#endif
#ifdef __LINUX
enum AudioRenderer
{
Null,
OpenAL,
ALSA
};
#endif
Q_ENUM(AudioRenderer)
その後、私が呼び出されます。この場合、enumを文字列に変換して設定ファイルに書き込みます。
ただし、これを実行しようとするたびに、メタノームの内部mobjはnullと表示されます。私は(私は通常、それをダウンロードしたが、あなたはまだ含まれ、ヘッダーに続くことができる)Qtのコードの一部をステップ実行することができます
+ metaEnum {mobj=0x0000000000000000 <NULL> handle=0 } QMetaEnum
を(Visual Studioのデバッガから撮影)。
template<typename T> static QMetaEnum fromType() {
Q_STATIC_ASSERT_X(QtPrivate::IsQEnumHelper<T>::Value,
"QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG");
const QMetaObject *metaObject = qt_getEnumMetaObject(T());
const char *name = qt_getEnumName(T());
return metaObject->enumerator(metaObject->indexOfEnumerator(name));
}
名前を正しく取得しますが、最後の行でも無効なメタネームが返されます。
これを回避する手段はありますか? Qtメタ列挙体でプロセッサ定義を使用できますか?私はプリプロセッサコマンドを削除し、そのまま列挙型を持っているとします。コードは機能します。プリプロセッサが何かを壊すようです。
ありがとうございました! Qt 5.8を使用しています。
「moc」は、_compiler predefined_マクロであるため、2つのマクロが分からないような気がします。あなたは '#ifdef Q_OS_WIN'と' Q_OS_LINUX'でもっとうまくいくかもしれません。 – Oktalist