本文共 1905 字,大约阅读时间需要 6 分钟。
QT设计者,针对不同类型的事件,提供了不同的事件处理器来与之相对应。那么QT是怎么让不同的事件与之对应的事件处理器相关联的呢?我们不难猜想在事件和事件处理器中间必定有一个桥梁。
这个桥梁就是QObject::event()函数,该函数是虚函数,QObject的子类例如QWidget都实现了该函数。该函数的主要功能是进行事件的分发,也就是将不同类型的事件与之相对应的事件处理器相关联,该函数并不对事件进行处理,真正的事件处理是在事件处理器中进行的。 例如:当QWidget产生QPaintEvent事件后,QWidget的event函数会将该事件分发给QWidget::paintEvent()事件处理器,这样该事件就得到处理了。以上内容用一个图形表示就是:
注意::paintEvent()函数已经在QT内部建立为QPaintEvent事件的槽,不能更改其函数名; QT其他的事件处理器(handler)有: bool event(QEvent *event) Q_DECL_OVERRIDE; virtual void mousePressEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseDoubleClickEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event); #ifndef QT_NO_WHEELEVENT virtual void wheelEvent(QWheelEvent *event); #endif virtual void keyPressEvent(QKeyEvent *event); virtual void keyReleaseEvent(QKeyEvent *event); virtual void focusInEvent(QFocusEvent *event); virtual void focusOutEvent(QFocusEvent *event); virtual void enterEvent(QEvent *event); virtual void leaveEvent(QEvent *event); virtual void paintEvent(QPaintEvent *event); virtual void moveEvent(QMoveEvent *event); virtual void resizeEvent(QResizeEvent *event); virtual void closeEvent(QCloseEvent *event); #ifndef QT_NO_CONTEXTMENU virtual void contextMenuEvent(QContextMenuEvent *event); #endif #ifndef QT_NO_TABLETEVENT virtual void tabletEvent(QTabletEvent *event); #endif #ifndef QT_NO_ACTION virtual void actionEvent(QActionEvent *event); #endif #ifndef QT_NO_DRAGANDDROP virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dragMoveEvent(QDragMoveEvent *event); virtual void dragLeaveEvent(QDragLeaveEvent *event); virtual void dropEvent(QDropEvent *event); #endif virtual void showEvent(QShowEvent *event); virtual void hideEvent(QHideEvent *event); virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result); // Misc. protected functions virtual void changeEvent(QEvent *);参考1:
参考2: