QEvent 子类化一例

53 篇文章 6 订阅

自定义一个QEvent应该很简单:

class CustomEvent : public QEvent
{
public:
    CustomEvent() : QEvent(static_cast<Type>(User+1))
    {
    }
};

不过传给父类的Type参数似乎有点让人头痛,因为用该事件的时候,一般都还要使用这个Type的值。

static成员变量

让Type作为该类的静态成员,应该是我们比较期待的:

class CustomEvent : public QEvent
{
public:
    static const Type myType = static_cast<Type>(User+1);
    CustomEvent() : QEvent(myType)
    {
    }
};

这样一来,使用(处理)事件时

if (event->type()==CustomEvent::myType)
{
}

不过呢,直接使用QEvent::User+1 这种东西,无法避免Type的重复。恩,要解决问题,需要使用:

registerEventType

int QEvent::registerEventType ( int hint = -1 )

这样一来,代码变成:

//x.h
class CustomEvent : public QEvent
{
public:
    static const Type myType;
    CustomEvent() : QEvent(myType)
    {
    }
};
//x.cpp
const QEvent::Type CustomEvent::myType = static_cast<QEvent::Type>(QEvent::registerEventType());

函数调用不能在类定义中初始化常量,只能放.cpp 文件中了。

static 成员函数

除了静态的成员变量,我们还可以使用静态的成员函数

class CustomEvent : public QEvent
{
public:
    static Type registeredType()
    { 
        static Type myType = static_cast<Type>(registerEventType());
        return myType;
    }    

    CustomEvent() : QEvent(registeredType())
    {
    }
};

多个Type?

如果我的CustomEvent接受 Type 参数,又该如何是好?

class CustomEvent : public QEvent
{
public:
    CustomEvent(Type t) : QEvent(t)
    {
    }
};

恩,还是用一堆 static 的静态数据成员吧,大概类似于

// x. h
class CustomEvent : public QEvent
{
public:
    static Type myType1;
    static Type myType2;
    static Type myType3;
    CustomEvent(Type t) : QEvent(t)
    {
    }
};
//x.cpp
QEvent::Type CustomEvent::myType1 = static_cast<QEvent::Type>(QEvent::registerEventType());
QEvent::Type CustomEvent::myType2 = static_cast<QEvent::Type>(QEvent::registerEventType());
QEvent::Type CustomEvent::myType3 = static_cast<QEvent::Type>(QEvent::registerEventType());

参考


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值