本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,由于对于事件老是感受很抽象,仍是从底层上理解一下比较好的吧!
前面说到了事件的做用,下面来看看咱们如何来接收事件。回忆一下前面的代码,咱们在子类中重写了事件函数,以便让这些子类按照咱们的须要完成某些功能,就像下面的代码:app
上面的代码和前面相似,在鼠标按下的事件中检测,若是按下的是左键,作咱们的处理工做,若是不是左键,则调用父类的函数。这在某种程度上说,是把事件向上传递给父类去响应,也就是说,咱们在子类中“忽略”了这个事件。
咱们能够把Qt的事件传递当作链状:若是子类没有处理这个事件,就会继续向其余类传递。其实,Qt的事件对象都有一个accept()函数和ignore()函数。正如它们的名字,前者用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;后者则告诉Qt,事件处理函数“忽略”了这个事件,须要继续传递,寻找另外的接受者。在事件处理函数中,能够使用isAccepted()来查询这个事件是否是已经被接收了。
事实上,咱们不多使用accept()和ignore()函数,而是想上面的示例同样,若是但愿忽略事件,只要调用父类的响应函数便可。记得咱们曾经说过,Qt中的事件大部分是protected的,所以,重写的函数一定存在着其父类中的响应函数,这个方法是可行的。为何要这么作呢?由于咱们没法确认父类中的这个处理函数没有操做,若是咱们在子类中直接忽略事件,Qt不会再去寻找其余的接受者,那么父类的操做也就不能进行,这可能会有潜在的危险。另外咱们查看一下QWidget的mousePressEvent()函数的实现:ide
请注意第一条语句,若是全部子类都没有覆盖mousePressEvent函数,这个事件会在这里被忽略掉,这暗示着这个组件不关心这个事件,这个事件就可能被传递给其父组件。
不过,事情也不是绝对的。在一个情形下,咱们必须使用accept()和ignore()函数,那就是在窗口关闭的时候。若是你在窗口关闭时须要有个询问对话框,那么就须要这么去写:函数
这样,咱们通过询问以后才能正常退出程序。ui