Qt:定义自定义事件类型

时间:2010-02-11 21:54:40

标签: c++ qt qt4

我通过继承QEvent在我的Qt应用程序中创建了一个自定义事件。

class MyEvent : public QEvent
{
  public:
    MyEvent() : QEvent((QEvent::Type)2000)) {}
    ~MyEvent(){}
}

为了检查此事件,我在event()方法中使用以下代码:

if (event->type() == (QEvent::Type)2000)
{
  ...
}

我希望能够在我的应用程序中的某处定义自定义事件的Type,这样我就不需要在我的事件方法中转换实际的整数。所以在我的event()方法中,我希望能够做类似

的事情
if (event->type() == MyEventType)
{
  ...
}

我想对代码中的方法和位置有什么想法?

3 个答案:

答案 0 :(得分:16)

如果事件类型标识了您的特定类,我会把它放在那里:

class MyEvent : public QEvent {
public:
    static const QEvent::Type myType = static_cast<QEvent::Type>(2000);
    // ...
};

// usage:
if(evt->type() == MyEvent::myType) {
    // ...
}

答案 1 :(得分:15)

为方便起见,您可以使用QEvent :: registerEventType()静态函数为您的应用程序注册和保留自定义事件类型。这样做可以避免意外地重新使用已在应用程序中其他地方使用的自定义事件类型。

示例:

class QCustomEvent : public QEvent
{
public:
    QCustomEvent() : QEvent(QCustomEvent::type())
    {}

    virtual ~QCustomEvent()
    {}

    static QEvent::Type type()
    {
        if (customEventType == QEvent::None)
        {
            int generatedType = QEvent::registerEventType()
            customEventType = static_cast<QEvent::Type>(generatedType);
        }
        return customEventType;
    }

private:
    static QEvent::Type customEventType;
};

QEvent::Type QCustomEvent::customEventType = QEvent::None;

答案 2 :(得分:5)

处理此类问题的惯用方法是创建一个模板包装类,利用CRTP。对于每个自定义事件类型,此类模板表示新类型,因此每种类型都存在单独的staticType()成员,并返回其唯一的注册类型。

下面我给出三种识别类型的方法:

  1. staticType() - 这只是中调用应用程序,并且是与QEvent一起使用的类型。 的值不保证在应用程序的调用之间保持相同。他们属于持久存储,就像在日志中一样。

  2. localDurableType() - 这些将在调用之间和使用相同编译器的重新编译之间保持不变。在定义复杂事件时,它会保存durableType()方法的手动定义。

  3. durableType() - 这些是真正的跨平台,除非您更改代码中的事件类名称,否则它们将是相同的。如果您没有使用durableType()宏,则必须手动定义NEW_QEVENT

  4. 由于对localDurableType()的更改,{4}和durableType()在Qt 4和5之间存在差异。

    您可以通过以下两种方式之一使用标题:

    qHash

    <强> EventWrapper.h

    #include "EventWrapper.h"
    
    class MyComplexEvent : public EventWrapper<MyComplexEvent> {
       // An event with custom data members
       static int durableType() { return qHash("MyEvent"); }
       ...
    };
    
    NEW_QEVENT(MySimpleEvent) // A simple event carrying no data but its type.