Qt程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发;事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。Qt事件的类型很多,常见的qt的事件如下:
除了系统预定义的事件,有时我们还需要自定义事件,用来完成某种动作,或者将某种动作发送到Qt的事件循环中,用于主界面的显示。
例如,在使用OpenCV、libhv这种第三方组件的时候,libhv通过网络接收数据的时候需要注册接收回调函数,在Qt中回调函数为静态函数,无法将接收到的数据在UI界面上显示。
解决办法就可以使用实现附带参数的自定义事件,将该事件发送到Qt的主事件循环中,这样在customEvent中就可以将收到的数据通过ui指针在界面控件上显示了。
Qt的事件所有的父类是:QEvent
Qt事件类型:QEvent::Type
其中,可供用户自定义使用的事件ID为1000~65535。
自定义事件方法也比较简单,继承QEvent并将自定义类型传入即可。
下面展示示例:
自定义类型头文件:
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H#include
#include // 注册自定义事件类型
#define CSTM_EVENT_ID1 static_cast((QEvent::User + 1))
#define CSTM_EVENT_ID2 static_cast((QEvent::User + 2))class CustomEvent : public QEvent
{
public:CustomEvent();
};class CustomEvent2 : public QEvent
{
public:CustomEvent2();QString msg; /* 用于携带数据 */
};#endif // CUSTOMEVENT_H
源文件:
#include "customevent.h"CustomEvent::CustomEvent() : QEvent(CSTM_EVENT_ID1)
{}CustomEvent2::CustomEvent2() : QEvent(CSTM_EVENT_ID2)
{}
发送事件函数有两个:sendEvent、postEvent。
区别:
sendEvent函数是阻塞式的,所以支持栈空间和堆空间事件对象的发送(局部对象和new分配的对象)。
postEvent静态函数实现非阻塞发送,当事件发送后立即返回,事件将会发送到事件队列中等待处理。
注:new分配的事件对象被处理后,会由Qt内部自动销毁。
发送事件可以使用QApplication::sendEvent,也可以利用全局变量qApp->sendEvent。
示例代码如下,在主窗体中重新实现虚函数customEvent:
protected:void customEvent(QEvent *event);
void Widget::customEvent(QEvent *event)
{switch ((int)event->type()){case CSTM_EVENT_ID1:{CustomEvent* e = static_cast(event);qDebug() << "custom event 1";break;}case CSTM_EVENT_ID2:{CustomEvent2* e = static_cast(event);qDebug() << "custom event 2: " << e->msg;break;}default:break;}
}void Widget::on_btnSendEvent1_clicked()
{CustomEvent e;qApp->sendEvent(this, &e);
}void Widget::on_btnSendEvent2_clicked()
{CustomEvent2 e;e.msg = "send event 2 msg !";qApp->sendEvent(this, &e);
}void Widget::on_btnPostEvent1_clicked()
{qApp->postEvent(this, new CustomEvent());
}void Widget::on_btnPostEvent2_clicked()
{CustomEvent2* e = new CustomEvent2();e->msg = "post event 2 msg !";qApp->postEvent(this, e);
}
ends…
上一篇:Spring注解@Transactional是什么?具体的使用方法
下一篇:CLIP-Event: Connecting Text and Images with Event Structures 论文解读