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";
}
}
我可以用两种方式使用这种机制:
#define
定义新的自定义值#define SP_NewPixmap (QStyle::SP_CustomBase+2)
enum
- 但每次都必须施放
例如enum MyPixmap { SP_NewPixmap = QStyle::SP_CustomBase+1; }
使用#define
是C风格,因此在C ++中不是正确的选择。创建一个单独的枚举会迫使我,每次都转换为Qt的枚举类型 - 也很难看。
还有另一种方式,有点聪明吗?
答案 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 );