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

Qt学习之路(21): event()

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

今 天要说的是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

分享到:
评论

相关推荐

    《Qt 学习之路 2》

    《Qt学习之路2》中也会介绍如何通过覆盖event()函数来处理事件,以及如何使用事件过滤器进行事件的过滤和拦截,这些内容对于编写响应式和交互性强的应用程序非常重要。 最后,Qt还提供了文件操作相关的组件和类,如...

    Qt+学习之路+2

    - **背景**: 本文档是基于作者之前的一个系列教程——《Qt学习之路》的更新版本,旨在适应Qt的新版本和发展趋势。 - **目的**: 更新和完善原有教程内容,使其更适合Qt 4.x和即将到来的Qt 5的学习需求。 - **定位**: ...

    Qt学习之路 绝对经典

    ### Qt学习之路 绝对经典 #### 一、前言:C++ GUI编程的选择与Qt简介 在C++的世界里,GUI(图形用户界面)编程并非语言标准的一部分,这与Java有所不同,在Java中,开发者可以选择AWT/Swing或SWT/JFace等标准库来...

    QT学习之路

    ### QT学习之路知识点总结 #### 一、前言:为何选择Qt? - **Qt与C++ GUI编程**:Qt是C++的一种GUI编程框架,并非C++标准的一部分。相比之下,Java有内置的AWT/Swing支持,而C++提供了多种第三方库作为GUI编程的...

    QT学习之路2 (1~82篇)

    21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. ...

    Qt学习之路2 (基于Qt5.0.1共58章)

    基于最新的Qt5.0.1的学习书籍,非常适合QT5的入门学习。 目录 1. 序 2. Qt 前言 3. Hello, world! 4. 信号槽 5. 自定义信号槽 6. Qt 模块简介 7. MainWindow 简介 8. 添加动作 9. 资源文件 10. 对象模型 11. 布局...

    qt经典学习笔记

    以下将基于这个标题和描述,以及可能包含在文档"qt经典学习笔记1.doc"中的内容,来阐述QT学习的一些关键知识点。 1. **QT基础概念**:QT的核心是其对象模型,所有的类都是继承自QObject,通过信号与槽机制实现对象...

    QT里的事件使用简单方法QtEvent.zip

    QT中的事件处理是其核心功能之一,它使得GUI应用程序能够响应用户的交互和其他系统级的触发。在QT中,事件机制是基于C++的面向对象设计,通过消息队列和事件循环来实现。以下是对QT事件使用的详细介绍: 1. **事件...

    Qt5.10+GUI完全参考手册,qt5.15.2,QT

    《Qt5.10+GUI完全参考手册》是Qt开发者的重要参考资料,涵盖了Qt5.15.2版本的核心功能和GUI...通过学习《Qt5.10+GUI完全参考手册》,开发者可以深入理解Qt的各个层面,从而高效地构建功能丰富的桌面和移动应用程序。

    QT程序设计初级教程

    6. **QT事件处理**:学习编写事件处理器,如event()函数,以及如何重写特定的事件处理函数,如mousePressEvent()。 7. **QT信号与槽**:深入理解信号与槽的连接方式,包括直接连接、队列连接和临时连接,以及如何...

    Qt5 学习之路示例:时钟

    学习这个示例可以帮助开发者理解Qt5的图形界面编程,以及如何利用Qt的绘图机制创建动态的时钟应用。通过深入研究和实践,可以进一步掌握Qt5的其他组件和功能,如布局管理、信号与槽机制、资源系统等,从而构建更复杂...

    QT事件学习

    QT 事件学习 本文档主要探讨 QT 事件处理机制,内容从浅到深,涵盖了 QT 事件的产生、处理和派发机制。 一、QT 事件简介 QT 程序是事件驱动的,程序的每个动作都是由内部某个事件所触发。QT 事件的发生和处理成为...

    qt必备学习手册初级

    4.1 Qt窗口坐标体系 21 坐标体系 21 4.2 QWidget 21 4.2.1 对象模型 21 4.3 QMainWindow 23 4.3.1 菜单栏 24 4.3.2 工具栏 25 4.3.3 状态栏 25 4.4 资源文件 26 4.5 对话框QDialog 29 4.5.1 基本概念 29 4.5.2 标准...

    Qt学习之QPushButton添加右键菜单2.zip

    这个“Qt学习之QPushButton添加右键菜单2.zip”文件可能包含了一个示例项目,演示了如何在QPushButton上实现这一特性。下面将详细介绍如何在Qt中实现这一功能。 首先,我们需要了解Qt的信号和槽机制。这是Qt事件...

    PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性.rar

    在PyQt框架中,Qt库提供了丰富的GUI组件和功能,其中QAbstractItemView是一个非常重要的抽象基类,它是多种表格和列表视图的基础,如QTableView、QListView和QTreeView等。本随笔主要探讨的是QAbstractItemView的一...

    qt远程桌面控制 qt远程桌面控制

    QT远程桌面控制是一种基于Qt库实现的远程桌面访问解决方案,允许用户通过网络连接到另一台计算机,进行远程操控。...通过学习和理解这个项目,开发者可以深入掌握Qt在实际应用中的用法,提升自己的技能。

    Qt学习之QPushButton添加右键菜单

    在Qt编程中,QPushButton是一个非常常用的控件,用于创建用户界面中的按钮。当我们希望为QPushButton添加右键菜单功能时,可以实现更丰富的交互性。本文将深入探讨如何在Qt环境中利用QPushButton实现这一功能。 ...

Global site tag (gtag.js) - Google Analytics