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)

请注意Q_DECLARE_FLAGS通过创建QFlagstypedef 实现您所询问的行为的宏。请参阅http://qt-project.org/doc/qt-4.8/qflags.html#Q_DECLARE_FLAGS

于 2012-04-26T07:36:17.550 回答
2

如果您仔细查看 Qt 文档(http://doc.qt.io/archives/qt-4.7/qt.html#DockWidgetArea-enum对于您的特定情况),您会看到 Qt 使用模板化的 QFlags 类来存储以类型安全的方式对枚举值进行 OR 组合。

编辑:看起来有两种答案,因为你的问题不是很清楚。仔细阅读您的问题后,我认为以下是您想要的。

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 回答