当前位置:天才代写 > tutorial > C语言/C++ 教程 > Qt进修之路(21):event()

Qt进修之路(21):event()

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:480

本日要说的是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

 

    关键字:

天才代写-代写联系方式