<b>Qt学习之路(21):event()</b>[VC/C++编程]
本文“<b>Qt学习之路(21):event()</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本日要说的是event()函数.记得之前曾经提到过这个函数,说在事件对象成立完毕后,Qt将这个事件对象传送给QObject的event()函数. event()函数并不直接处理事件,而是将这些事件对象按照它们差别的范例,分发给差别的事件处理器(event handler).
event() 函数主要用于事件的分发,所以,假如你但愿在事件分发之前做一些操作,那么,就需求注意这个event()函数了.为了到达这种目的,我们可以重写 event()函数.比方,假如你但愿在窗口中的tab键按下时将核心移动到下一组件,而不是让具有核心的组件处理,那么你便可以担当QWidget,并重写它的event()函数,已到达这个目的:
bool MyWidget::event(QEvent *event) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if (keyEvent->key() == Qt::Key_Tab) {
// 处理Tab鍵
return true;
}
}
return QWidget::event(event);
}
event() 函数承受一个QEvent对象,也就是需求这个函数举行转发的对象.为了举行转发,一定需求有一系列的范例判断,这便可以调用QEvent的type() 函数,其返回值是QEvent::Type范例的列举.我们处理过自己需求的事件后,可以直接return回去,关于其他我们不关心的事件,需求调用父类的event()函数持续转发,不然这个组件就只能处理我们定义的事件了.
event()函数返回值是bool范例,假如传入的事件已被辨认并且处理,返回true,不然返回false.假如返回值是true,QApplication会认为这个事件已经处理完毕,会持续处理事件行列中的下一事件;假如返回值是false,QApplication会尝试探求这个事件的下一个处理函数.
event()函数的返回值和事件的 accept()和ignore()函数差别.accept()和ignore()函数用于差别的事件处理器之间的沟通,比方判断这一事件能否处理;event()函数的返回值主如果告诉QApplication的notify()函数能否处理下一事件.为了越发明晰这一点,我们来看看 QWidget的event()函数是若何定义的:
bool QWidget::event(QEvent *event) {
switch (e->type()) {
case QEvent::KeyPress:
keyPressEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;
case QEvent::KeyRelease:
keyReleaseEvent((QKeyEvent *)event);
if (!((QKeyEvent *)event)->isAccepted())
return false;
break;
// more...
}
return true;
}
QWidget 的event()函数利用一个宏大的switch来判断QEvent的type,并且分发给差别的事件处理函数.在事件处理函数之后,利用这个事件的 isAccepted()办法,获知这个事件是不是被承受,假如没有被承受则event()函数当即返回false,不然返回true.
别的一个必须重写event()函数的情形是有自定义事件的时刻.假如你的程序中有自定义事件,则必须重写event()函数以便将自定义事件举行分发,不然你的自定义事件永久也不会被调用.关于自定义事件,我们会在今后的章节中介绍.
出处:http://devbean.blog.51cto.com/448512/230883
以上是“<b>Qt学习之路(21):event()</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |