当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

Qt学习之路(20):事件接纳与忽视[VC/C++编程]

赞助商链接



  本文“Qt学习之路(20):事件接纳与忽视[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本章内容也是关于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


  以上是“Qt学习之路(20):事件接纳与忽视[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>Qt学习之路(28):坐标变更</b>
  • Qt学习之路(29):画图设备
  • <b>Qt学习之路(30):Graphics View Framework</b>
  • <b>Qt学习之路(31):一个简易画板的实现(QWidget)</b>
  • Qt学习之路(32):一个简易画板的实现(Graphics View)
  • Qt学习之路(33):国际化(上)
  • <b>Qt学习之路(34):国际化(下)</b>
  • <b>Qt学习之路(9):深化理解信号槽</b>
  • Qt学习之路(10):Meta-Object系统
  • <b>Qt学习之路(11):MainWindow</b>
  • <b>Qt学习之路(12):菜单和工具条</b>
  • <b>Qt学习之路(13):菜单和工具条(续)</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .