Qt进修之路(20):事件吸收与忽略
当前位置:以往代写 > C/C++ 教程 >Qt进修之路(20):事件吸收与忽略
2019-06-13

Qt进修之路(20):事件吸收与忽略

Qt进修之路(20):事件吸收与忽略

本章内容也是关于Qt事件。或者这一章不能有一个完整的例子,因为对付事件老是感受很抽象,照旧从底层上领略一下较量好的吧!

前面说到了事件的浸染,下面来看看我们如何来吸收事件。回想一下前面的代码,我们在子类中重写了事件函数,以便让这些子类凭据我们的需要完成某些成果,就像下面的代码:

void MyLabel::mousePressEvent(QMouseEvent * event)
{
 if(event->button() == Qt::LeftButton) {
  // do something
 } else {
  QLabel::mousePressEvent(event);
 }
}

上面的代码和前面雷同,在鼠标按下的事件中检测,假如按下的是左键,做我们的处理惩罚事情,假如不是左键,则挪用父类的函数。这在某种水平上说,是把事件向上通报给父类去响应,也就是说,我们在子类中“忽略”了这个事件。

我们可以把Qt的事件通报当作链状:假如子类没有处理惩罚这个事件,就会继承向其他类通报。其实,Qt的事件工具都有一个accept()函数和 ignore()函数。正如它们的名字,前者用来汇报Qt,事件处理惩罚函数“吸收”了这个事件,不要再通报;后者则汇报Qt,事件处理惩罚函数“忽略”了这个事件,需要继承通报,寻找别的的接管者。在事件处理惩罚函数中,可以利用isAccepted()来查询这个事件是不是已经被吸收了。

事实上,我们很少利用accept()和ignore()函数,而是想上面的示例一样,假如但愿忽略事件,只要挪用父类的响应函数即可。记得我们曾经说过,Qt中的事件大部门是protected的,因此,重写的函数肯定存在着其父类中的响应函数,这个要领是可行的。为什么要这么做呢?因为我们无法确认父类中的这个处理惩罚函数没有操纵,假如我们在子类中直接忽略事件,Qt不会再去寻找其他的接管者,那么父类的操纵也就不能举办,这大概会有潜在的危险。别的我们查察一下QWidget的mousePressEvent()函数的实现:

void QWidget::mousePressEvent(QMouseEvent *event)
{
 event->ignore();
 if ((windowType() == Qt::Popup)) {
  event->accept();
  QWidget* w;
  while ((w = qApp->activePopupWidget()) && w != this){
   w->close();
   if (qApp->activePopupWidget() == w) // widget does not want to dissappear
    w->hide(); // hide at least
  }
  if (!rect().contains(event->pos())){
   close();
  }
 }
}

请留意第一条语句,假如所有子类都没有包围mousePressEvent函数,这个事件会在这里被忽略掉,也就是遏制流传。别的也可以看到,假如你在子类直接ignore了这个事件,QWidget事件处理惩罚函数就不会被挪用,那么,后头的Popup操纵或者就这么“莫名其妙”地消失了。

不外,工作也不是绝对的。在一个景象下,我们必需利用accept()和ignore()函数,那就是在窗口封锁的时候。假如你在窗口封锁时需要有个询问对话框,那么就需要这么去写:

void MainWindow::closeEvent(QCloseEvent * event)
{
 if(continueToClose()) {
  event->accept();
 } else {
  event->ignore();
 }
}
bool MainWindow::continueToClose()
{
 if(QMessageBox::question(this,tr("Quit"),tr("Are you sure to quit this application?"),QMessageBox::Yes | QMessageBox::No,
  QMessageBox::No)
  == QMessageBox::Yes) {
  return true;
 } else {
  return false;
 }
}

这样,我们颠末询问之后才气正常退出措施。

出处: http://devbean.blog.51cto.com/448512/225519

    关键字:

在线提交作业