我需要为 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;
}
关于如何简化它或至少用宏隐藏它有什么建议吗?
最佳答案
这就是模板的用途。它们可以与常数积分参数一起使用,这些参数也需要在编译时知道:
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;
然后可以将特定于每个事件类型的代码实现为模板特化。
关于c++ - 有没有更简洁的方法来注册 Qt 自定义事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224598/