干净的方式来处理Enum :: XX_CustomBase

时间:2012-01-19 10:36:55

标签: c++ qt enums

Qt将它的最后一个枚举定义为PREFIX_CustomBase,以允许框架用户使用自定义值扩展此枚举。 E.g。

enum StandardPixmap {
    ...
    SP_MediaSeekForward,
    SP_MediaSeekBackward,
    SP_MediaVolume,
    SP_MediaVolumeMuted,
    // do not add any values below/greater than this
    SP_CustomBase = 0xf0000000
};

此外,还有使用这些值调用的回调方法(插槽或虚拟方法),例如

QIcon MyCustomStyle::GetStandardPixmap( StandardPixmap ePixmap )
{
    switch( ePixmap )
    {
        case SP_NewPixmap:   return "/home/user/new_pixmap.svg";
        case SP_OtherPixmap: return "/home/user/other_pixmap.svg";
    }
}

我可以用两种方式使用这种机制:

  1. 使用#define定义新的自定义值
    例如#define SP_NewPixmap (QStyle::SP_CustomBase+2)
  2. 使用我自己的enum - 但每次都必须施放 例如enum MyPixmap { SP_NewPixmap = QStyle::SP_CustomBase+1; }
  3. 使用#define是C风格,因此在C ++中不是正确的选择。创建一个单独的枚举会迫使我,每次都转换为Qt的枚举类型 - 也很难看。

    还有另一种方式,有点聪明吗?

1 个答案:

答案 0 :(得分:0)

有一个技巧可能会对你有所帮助,但也许有点难看,如果你重写一个方法就行不通:为你的方法使用整数。

int和enums之间的关系是这样的:

int pixmap = QStyle::SP_MediaSeekForward; // compiles
pixmap = SP_NewPixmap;                    // compiles
QStyle::StandardPixmap ePixmap = pixmap;  // does not compile

因此,您可以将该方法的参数更改为int(如果是插槽,则不会明显覆盖虚拟方法)并执行:

QIcon MyCustomStyle::GetStandardPixmap( int ePixmap ) { /* ... */ }

然后致电

QIcon icon1 = GetStandardPixmap( QStyle::SP_MediaSeekForward );
QIcon icon2 = GetStandardPixmap( SP_NewPixmap );