有没有更清洁的方式来注册Qt自定义事件? [英] Is there a cleaner way to register Qt custom events?
本文介绍了有没有更清洁的方式来注册Qt自定义事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要为一个Qt应用程序创建几个自定义事件类。
I need to create several custom event classes for a Qt application.
现在,它看起来像我需要实现以下事件类型注册码为每个事件类:
Right now, it looks like I will need to implement the following event type registration code for each event class:
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;
}
有关如何简化此操作的建议,宏?
Any suggestions on how I can simplify this, or at least hide it with a macro?
推荐答案
这是模板。它们可以与常量整数参数一起使用,这些参数在编译时也需要知道:
That's what templates are for. They can be used with constant integral parameters, which need to be known at compile time too:
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;
}
静态初始化(beware!)如下所示:
Static initialization (beware!) looks like this:
QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;
每个事件类型的特定代码可以实现为模板专用化。
The code specific for each event type can be implemented as template specialization then.
这篇关于有没有更清洁的方式来注册Qt自定义事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文