QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子。

推荐直接调用QWidget的事件处理函数。而不是调用accept()和ignore()。

只有一种情况下,必须使用调用accept()和ignore(),那就是closeEvent(),在closeEvent()的事件处理函数中,必须调用accept()和ignore()。即如果想窗口被关闭,那么必须显示调用event->accept();如果不想关闭窗口,必须显示调用ignore(),否则窗口默认会关闭。

本章内容也是关于Qt事件。或许这一章不能有一个完整的例子,因为对于事件总是感觉很抽象,还是从底层上理解一下比较好的吧!

前面说到了事件的作用,下面来看看我们如何来接收事件。回忆一下前面的代码,我们在子类中重写了事件函数,以便让这些子类按照我们的需要完成某些功能,就像下面的代码:

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

上面的代码和前面类似,在鼠标按下的事件中检测,如果按下的是左键,做我们的处理工作,如果不是左键,则调用父类的函数。这在某种程度上说,是把事件向上传递给父类去响应,也就是说,我们在子类中“忽略”了这个事件。

比如上面的例子,eventLabel忽略了这个事件,那么这个事件就会被继续传递下去,实际上是传递给了eventLabel的父组件,QLabel,

accept()接收,表面eventLabel会处理这个事件,那么这个事件就不会再继续传递下去,那么QLabel就不会再收到这个事件,

我们可以把Qt的事件传递看成链状:如果子类没有处理这个事件,就会继续向其他类传递。

其实,Qt的事件对象都有一个accept()函数和ignore()函数。正如它们的名字,前者用来告诉Qt,事件处理函数“接收”了这个事件,不要再传递;后者则告诉Qt,事件处理函数“忽略”了这个事件,需要继续传递,寻找另外的接受者。在事件处理函数中,可以使用isAccepted()来查询这个事件是不是已经被接收了。

事实上,我们很少使用accept()和ignore()函数,而是想上面的示例一样,如果希望忽略事件,只要调用父类的响应函数即可。(其实作用是一样的)

为什么要这么做呢?因为我们无法确认父类中的这个处理函数没有操作,如果我们在子类中直接忽略事件,Qt不会再去寻找其他的接受者,那么父类的操作也就不能进行,这可能会有潜在的危险。

另外我们查看一下QWidget的mousePressEvent()函数的实现:

void QWidget::mousePressEvent(QMouseEvent * event)
{
         event->ignore();//QWidget 会忽略这个事件,
         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();
                }
        }
}

请注意第一条语句,如果所有子类(比如EventLabel类,)都没有重写mousePressEvent函数,这个事件会在这里被忽略掉,这暗示着这个组件(eventLabel)不关心这个事件,这个事件就可能被传递给其父组件。

不过,事情也不是绝对的。在一个情形下,我们必须使用accept()和ignore()函数,那就是在窗口关闭的时候。这个必须明确显示的调用accept()和ignore(),

在closeEvent()事件处理函数中,accept()是关闭窗口,ignore()是不关闭窗口,只有在closeEvent()中才是这样,

如果你在窗口关闭时需要有个询问对话框,那么就需要这么去写:

closeEvent事件的默认槽函数是QWidget类的CloseEvent()函数,该函数中,会关闭掉当前的widget,

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;
        }
}

这样,我们经过询问之后才能正常退出程序。

qevent 事件的accept()和ignore()相关推荐

  1. QEvent的accept()和ignore()函数功能

    QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用 ...

  2. QT-qevent 事件的accept()和ignore()

    QEvent的accept()和ignore()一般不会用到,因为不如直接调用QWidget类的事件处理函数直接,而且作用是一样的,见下面的例子. 推荐直接调用QWidget的事件处理函数.而不是调用 ...

  3. qt中 accept()和ignore()函数

    首先来看一段代码: //!!! Qt5 // ---------- custombutton.h ---------- // class CustomButton : public QPushButt ...

  4. 17.QT-事件处理分析、事件过滤器、拖放事件

    Qt事件处理介绍 Qt平台会将系统产生的消息转换为Qt事件 Qt事件是一个QEvent的对象 Qt事件用来描述程序内部或外部发生的动作 任意的QObject对象都具备事件处理的能力 Qt常见的事件继承 ...

  5. Qt消息机制和事件、事件过滤

    一,事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等 ...

  6. qt-重写event(),事件过滤器,定时器,事件总结

    一.认识事件 1.事件(event) 是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如 ...

  7. QT中事件处理、事件过滤器、拖放事件分析

    Qt: 事件过滤器 obj->installEventFilter(filterObject);常常是obj->installEventFilter(this). 发送到obj的所有事件, ...

  8. QT的事件分发、事件过滤器详解

    一.事件的流向 QT的各种控件(QObject的子类)都有事件处理成员函数,例如: bool QObject::event(QEvent *e);//所有事件 dragEnterEvent(QDrag ...

  9. Qt消息机制和事件概述(一)

    一,事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等 ...

最新文章

  1. 分布式技术追踪 2017年第十五期
  2. 学习总结:CSS(一)定义方式、选择器、选择器权重
  3. java基础深入_java编程基础之方法深入
  4. 均匀白噪声的定义及特点_职业卫生噪声布点与检测实务
  5. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
  6. go micro java_Java Micro Framework:您无法忽略的新趋势
  7. 【工具使用】Xray与Burp联动--流量转发插件Passive Scan Client
  8. perl学习之:函数总结
  9. ubuntu中查找文件后高亮_vim查找替换及取消高亮
  10. php文本框输入内容过滤,为什么没能过滤掉文本框输入的所有反斜杠?
  11. Android Studio禁止混淆JNI代码
  12. java泛型的英文_Java泛型一:泛型的定义及规则
  13. 软考对程序员的作用,对程序员有多大意义?
  14. 运用R语言绘制火山图
  15. 多媒体一体机计算机打不开,多媒体教学一体机突然打不开PPT是怎么回事?
  16. 英诺重明320T服务器安装VMware操作系统流程(图文超详细版)
  17. 怎样把PDF翻译成中文
  18. Windows2000 内核级进程隐藏、侦测技术[毕业论文]
  19. 改HTML5里的input标签的required属性的提示为英文的
  20. wechat小程序布局flex

热门文章

  1. LabVIEW图形化TensoRT工具包的安装下载分享
  2. OpenLayers3 地图图层(Layers) 详解
  3. 全网首发 | Mac版 PS2022 终于来了,支持M1芯片,五大新黑科技
  4. Mac安装软件时提示“文件已损坏,您应该将它移到废纸篓”解决办法(亲测有效)
  5. 二维burgers方程_用格子Boltzmann方法研究二维Burgers方程
  6. Python 之 如何一行输入多个整数
  7. scrollView 横向
  8. 如何搭建一个属于自己的直播平台?
  9. java线程状态管理
  10. 文本文档写html图片显示不出来,word文档几种不显示图片的解决方法