2

Qt を使用する場合、多くの関数はフラグ Qt::LeftDockWidgetArea のような引数を取ります。

Qt のソースを調べても、このネーミング動作を実現する方法を理解できませんでした。一般的な C++ ですか、それとも Qt 固有ですか?

クラスMyClassがあるとします:

class MyClass {
    public:
        MyClass();
        void setFlag(???);
};

次のようにsetFlagメソッドを呼び出したい:

MyClass mc;
mc.setFlag(MyClass::flag1 | MyClass::flag2)

flag1 と flag2 は 0x01 と 0x02 である必要があります。これは列挙型ですか? それはどこに宣言すればいいですか?そして、メソッドの引数は何ですか?

これが明らかな場合は申し訳ありませんが、わかりません。

解決策(回答から)

とても良い。以下の回答を読んで、これを追加しました:(実際にはフラグは必要なく、列挙型からの数字だけであることに注意してください。これにより、大幅に簡素化されました)

namespace MyNames {
    typedef enum {
        FA = 0,
        FB = 1
    } Field;
}

class MyClass
{
    public:
        MyClass();
        char getField(MyNames::Field f) const;
};

これにより、実際に次の呼び出しが許可されます (許可されません)。

mc.getField(MyNames::FA) //OK
mc.getField(1)           //not OK
4

3 に答える 3

6

の定義を見てくださいQt::LeftDockWidgetArea:

enum DockWidgetArea {
    LeftDockWidgetArea = 0x1,
    RightDockWidgetArea = 0x2,
    TopDockWidgetArea = 0x4,
    BottomDockWidgetArea = 0x8,

    DockWidgetArea_Mask = 0xf,
    AllDockWidgetAreas = DockWidgetArea_Mask,
    NoDockWidgetArea = 0
};

Q_DECLARE_FLAGS(DockWidgetAreas, DockWidgetArea)

typedefQ_DECLARE_FLAGSを作成することで、求めている動作を実現するマクロに注意してください。http://qt-project.org/doc/qt-4.8/qflags.html#Q_DECLARE_FLAGSQFlagsを参照してください。

于 2012-04-26T07:36:17.550 に答える
2

Qt のドキュメント (特定のケースではhttp://doc.qt.io/archives/qt-4.7/qt.html#DockWidgetArea-enum ) を注意深く見ると、Qt がテンプレート化された QFlags クラスを使用して格納することがわかります。タイプ セーフな方法での列挙値の OR 組み合わせ。

編集:質問があまり明確ではないため、2種類の回答があるようです。あなたの質問を注意深く読むと、次のことがあなたが望んでいることだと思います。

class MyClass {
    public:
        enum Flags{
            Flag1 = 0x01,
            Flag2 = 0x02
        }
        MyClass();
        void setFlag(int Flags);//Not type-safe but works.
        void setFlag(Flags<MyClass::Flags> Flags);//Type-safe but you have to create a Flags class yourself
};

詳細な説明は、ここの古い質問にあります: How to use enums as flags in C++?

于 2012-04-26T07:36:14.850 に答える
1

これ (または類似のもの) は次の場所にありsrc\corelib\global\qnamespace.hます。

#ifndef Q_MOC_RUN
namespace
#else
class Q_CORE_EXPORT
#endif
Qt {

これは通常単純になります

namespace Qt {

このQtネームスペース内で宣言された名前 ( などLeftDockWidgetArea) を参照するには、その前に を付けQt::ます。

于 2012-04-26T07:35:12.443 に答える