【发布时间】:2012-04-26 07:25:17
【问题描述】:
在使用 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
【问题讨论】:
-
但是,您的解决方案没有 Qt 标志的标志行为。它解决了一个完全不同的问题。
-
是的。我真的很抱歉。这是我写标志问题时的错误。我很乐意将解决方案扩展为包含枚举的二进制运算符。 (它们的值可以很容易地更改为 0x01、0x02、0x04...)
-
但是如果您想允许 MyNames::Field 枚举值的 OR 组合,您的输入参数类型不能再简单地是 MyNames::Field,即使您可以轻松地重新定义它们的值。例如。 mc.getField(MyNames::FA | MyNames::FB);如果您只重新定义 FA = 0x01 和 FB = 0x02,将会失败。
-
如果你知道怎么做,如果你能在答案中解释它,我会很高兴 - 我们可以改进解决方案。