<< QT && C++ トップ

QFlagsを使ったフラグの作り方

enumで列挙体を作ってフラグを管理する場合、QFlagsクラスを使うと次のような利点があります。

では実際のコードで、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の使い方でした。では、また!!

関連項目
プライバシーポリシー