【翻訳+仕上げ】QFlags詳細説明

1.説明

QFlags <Enum>クラスはテンプレートクラスであり、Enumは列挙型です。QFlagsは、列挙された値の組み合わせを格納するためにQtで使用されます。

列挙値を格納または組み合わせるための従来のC ++の方法は、整数変数を使用することです。この方法の不便な点は、型チェックがまったくなく、任意の列挙値が他の任意の列挙値と論理演算を実行できることです。

    enum Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };

    enum Direction
    {
        horizontal = 2,
        vertical = 3,
    };

コンパイラーは、次の2つの操作のエラーを報告しません。

    Orientation::Up | Direction::horizontal;
    Orientation::Up | Orientation::Down;

2つの無関係な列挙値の最初のタイプは論理演算を実行する意味がありません.2番目のタイプの演算は3になりますが、方向に値3の識別子がありません。

QtはQFlagsを使用して型安全性を提供します。

独自の列挙型にQFlagsを使用する場合は、Q_DECLARE_FLAGS()およびQ_DECLARE_OPERATORS_FOR_FLAGS()。

例:

  class MyClass
  {
  public:
    enum Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_DECLARE_FLAGS(Orientations, Orientation)
      ...
  };

  Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Orientations)

 これにより、Flags:Orientations for the enumeration Orientationsが作成されます。このOrientationsのタイプは、QFlags <MyClass :: Orientation>です。Orientationsオブジェクトを使用して、論理演算の値を受け取ることができます。

    Orientations f = Orientation::Up | Orientation::Down;

2つ、フラグとメタオブジェクトシステム

メタオブジェクトシステムとQtDesignerで列挙を使用するには、次を追加する必要があります。Q_FLAG(オリエンテーション)

3、命名規則

通常、列挙型の後にsまたはFlagを追加します

第4に、論理演算にQFlagsを使用します

    enum class Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_ENUM(Orientation)		//如不使用Orientation,可省略
    Q_DECLARE_FLAGS(Orientations, Orientation)
    Q_FLAG(Orientations)


Q_DECLARE_OPERATORS_FOR_FLAGS(Widget::Orientations)
    QMetaEnum m = QMetaEnum::fromType<Widget::Orientations>();
    qDebug()<< "key To Value:"<<m.keyToValue("Up|Down");
    qDebug()<< "value To Key:"<<m.valueToKey(Orientation::Up|Orientation::Down);
    qDebug()<< "keys To Value:"<<m.keysToValue("Up|Down");
    qDebug()<< "value To Keys:"<<m.valueToKeys(Orientation::Up|Orientation::Down)<<endl;

    qDebug()<< "isFlag:"<<m.isFlag();
    qDebug()<< "name:"<<m.name();
    qDebug()<< "enumName:"<<m.enumName();
    qDebug()<< "scope:"<<m.scope()<<endl;

図に示すように、上下のOR演算結果は-1であり、対応する列挙マークはありません。

これに基づいて、論理演算の結果の妥当性をテストできます。

5、列挙は名前空間で定義されます 

いくつかの違いがあります。

1. Q_NAMESPACEマクロを追加する必要があります。このマクロを使用すると、名前空間でメタオブジェクト機能を簡略化できますが、シグナルスロットはサポートされません。

2.列挙を登録するためのマクロをQ_ENUM_NSおよびQ_FLAG_NSに変更します

3. Q_DECLARE_OPERATORS_FOR_FLAGSは、名前空間で定義されています。

4.を使用する場合は、前のクラス名を名前空間の名前に変更します。

namespace test
{
    Q_NAMESPACE
    enum class Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_ENUM_NS(Orientation)
    Q_DECLARE_FLAGS(Orientations, Orientation)
    Q_FLAG_NS(Orientations)
    Q_DECLARE_OPERATORS_FOR_FLAGS(Orientations)
}

おすすめ

転載: blog.csdn.net/kenfan1647/article/details/114801093