Есть ли более чистый способ регистрации пользовательских событий Qt?
Мне нужно создать несколько пользовательских классов событий для приложения Qt.
Сейчас, похоже, мне потребуется реализовать следующий код регистрации типа события для каждого класса событий:
class MyEvent : public QEvent
{
public:
MyEvent() : QEvent(registeredType())
{
}
static QEvent::Type eventType;
private:
static QEvent::Type registeredType();
}
QEvent::Type MyEvent::eventType = QEvent::None;
QEvent::Type MyEvent::registeredType()
{
if (eventType == QEvent::None)
{
int generatedType = QEvent::registerEventType();
eventType = static_cast<QEvent::Type>(generatedType);
}
return eventType;
}
Любые предложения о том, как я могу упростить это или, по крайней мере, скрыть это с помощью макроса?
1 ответ
Решение
Для этого и нужны шаблоны. Их можно использовать с постоянными интегральными параметрами, которые также должны быть известны во время компиляции:
enum EventNames { UpdateEvent,... }
template<EventNames E>
class MyEvent : public QEvent
{
public:
MyEvent() : QEvent(registeredType())
{
}
static QEvent::Type eventType;
private:
static QEvent::Type registeredType();
}
Общий код выглядит так:
template<EventNames E>
QEvent::Type MyEvent<E>::registeredType()
{
if (eventType == QEvent::None)
{
int generatedType = QEvent::registerEventType();
eventType = static_cast<QEvent::Type>(generatedType);
}
return eventType;
}
Статическая инициализация (будьте осторожны!) Выглядит так:
QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;
Код, специфичный для каждого типа события, может быть реализован как специализация шаблона.