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{})分给各个子类处理。