有没有更简洁的方法来注册 Qt 自定义事件?
Posted
技术标签:
【中文标题】有没有更简洁的方法来注册 Qt 自定义事件?【英文标题】:Is there a cleaner way to register Qt custom events? 【发布时间】:2011-06-03 08:13:14 【问题描述】:我需要为 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;
关于如何简化它,或者至少用宏隐藏它的任何建议?
【问题讨论】:
你也可以看看this *** post。对我来说效果很好。 @Francois 是的,您链接到的答案提供了一个比这更优雅的解决方案,而且通常事件类型被定义为常量以防止突然覆盖事件。跨度> 【参考方案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;
每个事件类型的特定代码可以实现为模板特化。
【讨论】:
太棒了!如果我创建其他事件类,是否意味着我需要更改enum
?
是的。您还需要初始化每个模板静态,但如果您从给定类型创建多个事件对象,它们将照常共享静态
您也可以使用模板初始化模板静态:template<EventNames E> QEvent::Type MyEvent<E>::eventType = QEvent::None;
,然后您不需要为每个事件类型更新初始化。这是您可以在非类非函数类型上使用模板的唯一地方。以上是关于有没有更简洁的方法来注册 Qt 自定义事件?的主要内容,如果未能解决你的问题,请参考以下文章