Qt中的事件处理

来源:互联网 发布:电子印章生成器软件 编辑:程序博客网 时间:2024/06/06 02:08

图形界面应用程序的消息处理模型
这里写图片描述

操作系统发送的消息如何转为Qt中的信号?

  • Qt平台将系统产生的消息转换为Qt事件
    • Qt事件是一个QEvent的对象
    • Qt事件用于描述程序内部或者外部发生的动作
    • 任意的QObject对象都具备事件处理能力

GUI应用程序的事件处理方式

  • Qt事件产生后立即被分到QWidget对象
  • QWidget中的event(QEvent*)进行事件处理
  • event()根据事件类型调用不同的事件处理函数
  • 在事件处理函数中发送Qt中预定义的信号
  • 调用信号相关联的槽函数

QPushButton事件处理分析

  • 接收鼠标事件
  • 调用event(QEvent*)成员函数
  • 调用mouseReleaseEvent(QMouseEvent*)成员函数
  • 调用click()成员函数
  • 触发信号SIGNAL(clicked())

事件(QEvent)和信号(SIGNAL)不同

  • 事件由具体对象进行处理
  • 信号由具体对象主动产生
  • 改写事件处理函数可能导致程序行为发生改变
  • 信号是否存在对应的槽函数不会改变程序行为
  • 一般而言,信号在具体的时间处理函数中产生

QEvent中的关键成员函数

  • void ignore()
    • 接收者忽略当前事件,事件可能传递给父组件
  • void accept()
    • 接收者期望处理当前事件
  • bool isAccept()
    • 判断当前事件是否被处理

Qt中的事件过滤器

  • 事件过滤器可以对其他组件接收到的事件进行监控
  • 任意的QObject对象都可以作为事件过滤器使用
  • 事件过滤器对象需要重写eventfilter()函数

组件通过installEventFilter()函数安装事件过滤器

  • 事件过滤器在组件之前接收到事件
  • 事件过滤器能够决定是否将事件转发到组件对象

这里写图片描述

事件过滤器的典型实现

// 返回true表示事件已经处理,无需传递给obj
// 返回false则正常传递到obj

bool Widget::eventFilter(QObject* obj,QEvent* e){    if(/* 根据 obj 判断对象 */)    {        if(/* 根据e->type判断事件 */)        {            /* 事件处理逻辑 */        }           }    /* 调用父类中的同名函数 */        return QWidget::eventFilter(obj,e); }
原创粉丝点击