`
izuoyan
  • 浏览: 9222294 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(20): 事件接收与忽略

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/225519

本章内容也是关于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函数,这个事件会在这里被忽略掉,这暗示着这个组件不关心这个事件,这个事件就可能被传递给其父组件。

不过,事情也不是绝对的。在一个情形下,我们必须使用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 学习之路:DZY

    - **事件处理**:深入理解Qt的事件机制,包括事件的传递、接收与忽略,以及如何自定义事件。掌握这些技巧可以帮助开发者更好地控制用户界面的行为。 - **绘图功能**:Qt提供了强大的绘图功能,包括使用QPainter进行...

    Qt学习之路.pdf

    - **知识点**:Qt中的事件处理机制、事件的类型、事件的接收与忽略、事件过滤器的使用。 - **重要性**:事件处理是任何图形界面程序的核心,理解事件如何传递并被处理对于编写响应式的程序至关重要。 - **自定义...

    QT学习之路

    10. "事件"、"事件接收与忽略"、"事件过滤器"、"自定义事件" 这些章节则围绕Qt中的事件处理机制,包括事件的捕获、处理和过滤。 11. "QPAINTER" 和绘图相关的章节可能包括了如何使用QPainter类进行2D图形绘制,包括...

    Qt学习之路---尤其适用Qt初学者

    10. **事件处理** —— 介绍Qt的事件系统,包括事件的接收、忽略、自定义等。 11. **QPainter** —— 了解Qt的绘图系统,学会如何使用QPainter进行高级图形绘制。 12. **Graphics View Framework** —— 探索Qt的...

    Qt5学习之路2

    Qt5学习之路2涵盖了多个方面的知识点,这包括但不限于Qt基础,GUI组件,信号槽机制,Qt模块,事件处理,绘图系统,模型/视图架构,网络与数据库操作,以及QML和QtQuick2。本部分将会对这些知识点做详细说明。 ### ...

    Qt学习之路(1-60)

    笔记中提到的“事件接收与忽略”、“事件过滤器”和“自定义事件”部分,将帮助学习者掌握Qt中的事件处理机制。 ### 绘图系统 Qt的绘图系统包括QPainter类,用于2D绘图。它提供了强大的绘图能力,可以绘制图形、...

    Qt用于UDP通信对方停止发送,接收方仍有空报文出现问题

    在使用Qt进行UDP通信时,可能会遇到一种情况,即当发送方停止发送数据报文时,接收方仍能接收到空的报文。这通常是因为UDP的特性导致的。UDP(User Datagram Protocol)是一个无连接、不可靠的传输层协议,它不保证...

    Qt信号和槽

    信号与槽机制是Qt框架的核心之一,它极大地简化了对象间的通信过程,提高了代码的可维护性和可扩展性。理解并掌握信号与槽的使用方法对于开发高效的Qt应用至关重要。通过本文的介绍,相信您已经对Qt中的信号与槽机制...

    Qt基础学习笔记

    一个信号可以连接多个槽,也可以与其他信号连接,同时,信号和槽的参数需要匹配,但信号参数多余的部分会被忽略。如果参数类型不匹配或信号/槽不存在,Qt会在调试模式下给出警告。 Qt的元对象系统是其另一个重要...

    qt4学习笔记

    - 组件可以接受或忽略接收到的事件,通过重写`QWidget::event`函数来实现对事件的自定义处理。 **3.3 事件过滤器** - **事件过滤:** - 事件过滤器允许在事件传递到目标对象之前对其进行拦截和预处理。 - 可以...

    Qt 拖动事件 Qt 鼠标进入离开事件,常用事件的源代码

    在Qt编程中,拖放(Drag and Drop)和鼠标事件是构建用户界面的重要部分,它们提供了与用户交互的直观方式。下面将详细讲解Qt中的拖放事件、鼠标进入离开事件,以及相关的源代码实现。 首先,让我们来看看拖放事件...

    Qt核心机制与原理之信号与槽 demo

    **Qt核心机制与原理之信号与槽:深入理解与实战** Qt库,作为一个强大的跨平台应用开发框架,其核心机制之一就是信号与槽(Signals & Slots)机制。这个机制为对象间的通信提供了一种安全、灵活的方式,是Qt区别于...

    QT中事件过滤器源文件

    在Qt框架中,事件过滤器是用于拦截和处理对象间通信的一种机制,它允许我们对特定对象或其子对象接收到的事件进行监控和处理。本文将深入探讨Qt中的事件过滤器及其源文件,以便更好地理解和应用这一强大的功能。 ...

    Qt+EventFilter+给Qt对象安装事件过滤器

    在Qt框架中,事件过滤器(EventFilter)是一种强大的机制,允许我们监控和处理其他对象接收到的事件。本文将详细介绍如何使用`EventFilter`为Qt对象,如`QPushButton`,添加快捷键并过滤特定事件,确保用户只能通过...

    Qt 控件透明度设置方法总结

    - `Qt::WA_OpaquePaintEvent`:如果一个控件设置了这个属性,那么它的paint事件会被忽略,从而提高性能,但不适用于需要透明背景的情况。 2. **自定义绘图:** 如果需要更复杂的透明效果,可以重写`paintEvent`...

    qt_eventdispatcher_libevent-master.zip

    【标题】"qt_eventdispatcher_libevent-master.zip" 是一个与Qt框架相关的开源项目压缩包,其核心内容是将Libevent库集成到Qt事件调度系统中,以增强Qt应用程序的网络事件处理能力。Libevent是一个著名的跨平台事件...

    QtEvent.7zQtEvent.7z

    这个压缩包很可能包含了一系列关于Qt事件的示例代码、教程文档或者演示项目,帮助开发者更直观地学习如何在实践中使用Qt事件系统。例如,可能会有各种事件类型的处理示例,如窗口关闭事件(QCloseEvent)、定时器...

    Qt 键盘源码

    在Qt框架中,键盘事件处理是应用程序与用户交互的关键部分,尤其对于文本输入和游戏控制等场景至关重要。Qt 键盘源码分析将帮助我们深入理解这一核心组件的工作原理,以便于自定义键盘行为或优化性能。下面我们将...

Global site tag (gtag.js) - Google Analytics