有没有更简洁的方法来注册 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&lt;EventNames E&gt; QEvent::Type MyEvent&lt;E&gt;::eventType = QEvent::None;,然后您不需要为每个事件类型更新初始化。这是您可以在非类非函数类型上使用模板的唯一地方。

以上是关于有没有更简洁的方法来注册 Qt 自定义事件?的主要内容,如果未能解决你的问题,请参考以下文章

QT Windows平台屏蔽按键事件 自定义拦截按键输入

天河PCCAD自定义标题栏保存时,出现的80040154没有注册类错误怎么解决?

Qt:定义自定义事件类型

。。。事件注册方法之五。。。

Qt编写自定义控件70-扁平化flatui

关于ckfinder上传文件添加自定义处理方案