Qt4学习笔记 (3)

This is a repost from my previous Qt learning series, based on Qt 4.3.

    今天说一下Qt的事件处理(event processing)机制.

    我们之前已经用过了, 当一个QPushButton被点击的时候, 它的clicked() signal就会被emit, 这还是一个signal/slot的关系. 那么Qt中的event到底是干嘛的呢?
    书上有这么一句话: As a rule, signals are useful when using a widget, whereas events are useful when implementing a widget. 也就是说一般的话, 调用signal就可以了, 如果要自定义控件, 那么还是需要用到event的. Qt的event相当于系统native的事件的抽象. 比如windows的话就是对应于message.
    还是根据源码来剖析event和signal的关系. 下图是点击了一个QPushButton之后的call stack:

qt_3

    从QApplication::notify()开始, 然后是QPushButton::event()函数, 其中分别调用父类QAbstractButton:event(), QWidget::event(). 最后这个event被dispatch到QAbstractButton::mouseReleaseEvent(), 在这个函数中, 被判定为click了这个QButton, 即调用QAbstractButtonPrivate::click()函数. 最后再在这个函数中调用QAbstractButtonPrivate::emitClicked()函数来emit QAbstractButton::clicked()这个signal.
    所以说, event实际上是singal/slot的底层实现.

Leave a Reply

Your email address will not be published. Required fields are marked *