Qt源码笔记:事件 QEvent

38 阅读1分钟

Qt 事件系统流程

事件分为产生、分发、处理三个流程

事件产生

即抛出 Event 对象,通过不同 Event 对象中的各个属性使得事件处理函数获得足够的上下文信息。

classDiagram
  QEvent <|-- QTimerEvent
  QEvent <|-- QInputEvent
  QEvent <|-- QEnterEvent
  QInputEvent <|-- QMouseEvent
  QInputEvent <|--QContextMenuEvent  
  QEvent : +enum Type
  QEvent : -ushort spont
  QEvent : -ushort m_accept
  QEvent: +type()
  QEvent: +accept()
  QEvent: +spontaneous()
  class QTimerEvent{
    -int id
    int timerId()
  }
  class QInputEvent{
    -ulong ts;
    -Qt::KeyboardModifiers modState;// func keys
    +timestamp()
  }   
  class QContextMenuEvent{
    +pos()
    +globalPos()
    +button()
    +buttons()
  }

事件分发

graph BT
  B(EventRaisedWidget)
  B --> QCoreApplication{ConnectionType}
  QCoreApplication -->|Auto| D[Auto]
  QCoreApplication -->|sendEvent| E[Direct]
  QCoreApplication -->|postEvent| F[BlockingQueued]
  QCoreApplication -->|unique| G[Unique]

事件处理

QObject::event(QEvent *e)预先定义了事件处理流程:按照事件的类型(enum Type{})分给各个子类处理。

TODO