QFlagsを使ったフラグの作り方
enumで列挙体を作ってフラグを管理する場合、QFlagsクラスを使うと次のような利点があります。
- フラグ同士の論理和や論理積が楽にできる
- 複数のフラグを1つにまとめることができる
- 特定のフラグが含まれるか調べることができる
では実際のコードで、QFlagsを使うには直接インスタンスを作らずに専用のマクロを使います。それが、Q_DECLARE_FLAGSというマクロです。1つめの引数にフラグ名、2つめの引数に列挙体名を渡します。
Q_DECLARE_FLAGS(MyFlags, MyEnum)
ここではMyFlagsがMyEnumtという列挙体に対する、QFlagsを作っています。
その後フラグ同士の論理和や論理積などの演算を利用するために、QFlgasを宣言したクラス外で次の、Q_DECLARE_OPERATORS_FOR_FLAGSマクロを使います。
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::MyFlags)
MyFlagsを宣言したMyClassのコード全体は次のようになっています。
class MyClass : public QObject{ explicit MyClass(){} ~MyClass(){} enum MyEnum { ONE, TWO, THREE }; //列挙体 Q_DECLARE_FLAGS(MyFlags, MyEnum) //MyFlagsというフラグを宣言 }; Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::MyFlags) //論理和や論理積の演算子を使えるようにする
実際に宣言したQFlagsは次のような使い方をします。
QFlags flags(ONE | TWO); flags |= THREE; if(flags.testFlag(THREE)){ qDebug() << "flags contains THREE."; }
testFlagで特定のフラグが含まれているか調べることが可能です。
また、|=(論理和) や &=(論理積) などの演算子もオーバーライドしているのでフラグの追加や削除も楽にできます。
以上、QFlagsの使い方でした。では、また!!
関連項目
© Kaz