Qt 自定义事件

其实Qt自定义事件相对来说还是比较好用的,其优点实在有不必像使用信号和槽那样,使用非常多的connect,代码简洁,简单阐述如下:

使用自定义事件需要关注三方面:

1、自定义事件类型

2、事件发送

3、事件接收

使用起来比较简单,需要继承QEvent,同时提供一个大于1000 小于65535 的QEvent::Type类型的参数,该参数在QEvent类中是enum类型的枚举。

定义事件类型可以使用静态函数registerEventType,但是个人喜欢继承父类构建自己的事件类型

QEvent(const QEvent &other);

构建自己的事件类型,比如下图,定义一个获取通信的唯一序列号的事件子类,该事件包含自己的参数,供通信交互使用。Qt 自定义事件_第1张图片

上图给出了两个自定义事件类,自定义的Board_MN可以是1000,Board_SoftVersion可以是1001。有了自定义事件子类添加需要传输的数据,接下来就是发送事件了。

Qt提供了两种最常用的事件发送函数,Qt提供两个静态函数供使用,分别是栈上同步发送static bool sendEvent,和在堆上new出来的异步发送postEvent。如下图所示,第一个参数是要发送给那个对象也就是接收者,第二个是实例化的自定义事件子类。

Qt 自定义事件_第2张图片

Qt 自定义事件_第3张图片

 有了发送函数接下来是,接收者的事件处理函数。

Qt的QObject为我们提供了event()函数,比如某个界面类只需要重写该函数即可接收事件,完成对事件的处理,任何继承QObject的子类都可以重写该函数完成事件的接收。比如某个自定义界面的event()重写函数。

bool CustomWidget::event(QEvent *event) {
        if (event->type() == MyCustomEventType) {
                CustomEvent *myEvent = static_cast(event);
                // processing...
                return true;
        }

        return QWidget::event(event);
}

比如某个信息界面接收MN号和软件版本号的event()重写函数。

 Qt 自定义事件_第4张图片

想知道事件具体通信过程请看下图:

Qt 自定义事件_第5张图片

       对于和界面或者其他对象进行交互的自定义事件,想要进行通信必须知道界面对象,这里有个小技巧:可以使用QMap,键QString可以定义该界面唯一的字符串比如参数设置界面“PARASETPAGE”避免和其他界面重复,值int表示该界面的实例对象在构造时候传入this指针即可。这样在每个实例化界面都添加到map表中,事件通信时候通过键找到对应的对象即可发送事件;

总结:

1、首先将需要通信的对象和类型放在一个map表,QMap(type,object);

2、通过postEvent(receiver, event);找到步骤一中的对象,放到参数1位置,将事件类型放到参数2位置,那么post后。

3、接着在object的子类中重写event函数(类似重写鼠标按压事件等功能,只不过鼠标等事件是用户提前知道要处理的对象,这里是将发送的对象通过receiver,告知接收者需要处理event)。

经过以上三个步骤完成,信号的创建 -》发送-》处理

你可能感兴趣的:(Qt,自定义事件,qt,开发语言)