Чистый способ обработки Enum :: XX_CustomBase - PullRequest
0 голосов
/ 19 января 2012

Qt определяет его последнее перечисление как PREFIX_CustomBase, чтобы пользователи-фреймворки могли расширить это перечисление с помощью пользовательских значений.Например,

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; }

Использование #define в стиле C и, следовательно, в C ++ не является правильным выбором.Создание отдельного перечисления заставит меня каждый раз приводить к типу перечисления Qt - тоже безобразно.

Есть ли другой способ, с немного более умным?

1 Ответ

0 голосов
/ 19 января 2012

Есть хитрость, которая может вам помочь, но, вероятно, она немного уродлива и не работает, если вы переопределяете метод: Использование целых для ваших методов.

Соотношение между типами int и enum работает следующим образом:

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...