Qt、事件的发送和接收以及自定义用户事件

Qt、事件的发送和接收以及自定义用户事件


目录

  • Qt、事件的发送和接收以及自定义用户事件
      • 1、Qt的事件机制
      • 2、自定义事件
      • 3、事件的发送和处理


1、Qt的事件机制

Qt程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发;事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。Qt事件的类型很多,常见的qt的事件如下:

  • 键盘事件: 按键按下和松开.
  • 鼠标事件: 鼠标移动,鼠标按键的按下和松开.
  • 拖放事件: 用鼠标进行拖放.
  • 滚轮事件: 鼠标滚轮滚动.
  • 绘屏事件: 重绘屏幕的某些部分.
  • 定时事件: 定时器到时.
  • 焦点事件: 键盘焦点移动.
  • 进入和离开事件: 鼠标移入widget之内,或是移出.
  • 移动事件: widget的位置改变.
  • 大小改变事件: widget的大小改变.
  • 显示和隐藏事件: widget显示和隐藏.
  • 窗口事件: 窗口是否为当前窗口.

除了系统预定义的事件,有时我们还需要自定义事件,用来完成某种动作,或者将某种动作发送到Qt的事件循环中,用于主界面的显示。

例如,在使用OpenCV、libhv这种第三方组件的时候,libhv通过网络接收数据的时候需要注册接收回调函数,在Qt中回调函数为静态函数,无法将接收到的数据在UI界面上显示。

解决办法就可以使用实现附带参数的自定义事件,将该事件发送到Qt的主事件循环中,这样在customEvent中就可以将收到的数据通过ui指针在界面控件上显示了。


2、自定义事件

Qt的事件所有的父类是:QEvent

Qt事件类型:QEvent::Type

其中,可供用户自定义使用的事件ID为1000~65535。

自定义事件方法也比较简单,继承QEvent并将自定义类型传入即可。

下面展示示例:

自定义类型头文件:

#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H

#include 
#include 

// 注册自定义事件类型
#define CSTM_EVENT_ID1         static_cast<QEvent::Type>((QEvent::User + 1))
#define CSTM_EVENT_ID2         static_cast<QEvent::Type>((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)
{

}

3、事件的发送和处理

发送事件函数有两个: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<CustomEvent*>(event);
        qDebug() << "custom event 1";
        break;
    }
    case CSTM_EVENT_ID2:
    {
        CustomEvent2* e = static_cast<CustomEvent2*>(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…

你可能感兴趣的:(Qt,qt,QEvent,自定义事件,postEvent,sendEvent)