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

Qt学习之路(23): 自定义事件

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

这部分将作为Qt事件部分的结束。我们在前面已经从大概上了解了Qt的事件机制。下面要说的是如何自定义事件。

Qt 允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制。那么,为什么我需要使用事件,而不 是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的。事件的另外一个好处是,它可以使用过 滤器。

Qt中的自定义事件很简单,同其他类似的库的使用很相似,都是要继承一个类进行扩展。在Qt中,你需要继承的类是QEvent。注意,在Qt3中,你需要继承的类是QCustomEvent,不过这个类在Qt4中已经被废除(这里的废除是不建议使用,并不是从类库中删除)。

继 承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定义事件的类型值。这里的QEvent::Type类型是QEvent里面 定义的一个enum,因此,你是可以传递一个int的。重要的是,你的事件类型不能和已经存在的type值重复,否则会有不可预料的错误发生!因为系统会 将你的事件当做系统事件进行派发和调用。在Qt中,系统将保留0 - 999的值,也就是说,你的事件type要大于999. 具体来说,你的自定义事件的type要在QEvent::User和QEvent::MaxUser的范围之间。其中,QEvent::User值是 1000,QEvent::MaxUser的值是65535。从这里知道,你最多可以定义64536个事件,相信这个数字已经足够大了!但是,即便如此, 也只能保证用户自定义事件不能覆盖系统事件,并不能保证自定义事件之间不会被覆盖。为了解决这个问题,Qt提供了一个函 数:registerEventType(),用于自定义事件的注册。该函数签名如下:

static int QEvent::registerEventType ( int hint = -1 );


函 数是static的,因此可以使用QEvent类直接调用。函数接受一个int值,其默认值为-1,返回值是创建的这个Type类型的值。如果hint是 合法的,不会发生任何覆盖,则会返回这个值;如果hint不合法,系统会自动分配一个合法值并返回。因此,使用这个函数即可完成type值的指定。这个函 数是线程安全的,因此不必另外添加同步。

你可以在QEvent子类中添加自己的事件所需要的数据,然后进行事件的发送。Qt中提供了两种发送方式:

  • static bool QCoreApplication::sendEvent(QObjecy * receiver, QEvent * event):事件被QCoreApplication的notify()函数直接发送给receiver对象,返回值是事件处理函数的返回值。使用这个 函数必须 要在栈上创建对象,例如:
    QMouseEvent event (QEvent::MouseButtonPress, pos, 0, 0, 0);
    QApplication::sendEvent(mainWindow, &event );
  • static bool QCoreApplication::postEvent(QObject * receiver, QEvent * event):事件被QCoreApplication追加到事件列表的最后,并等待处理,该函数将事件追加后会立即返回,并且注意,该函数是线程安全 的。另外一点是,使用这个函数必须 要在堆上创建对象,例如:
    QApplication::postEvent(object , new MyEvent(QEvent::registerEventType(2048)));
    这 个对象不需要手动delete,Qt会自动delete掉!因此,如果在post事件之后调用delete,程序可能会崩溃。另 外,postEvent()函数还有一个重载的版本,增加一个优先级参数,具体请参见API。通过调用sendPostedEvent()函数可以让已提 交的事件立即得到处理。

如果要处理自定义事件,可以重写QObject的customEvent()函数,该函数接收一个QEvent对象作为参数。注意,在Qt3中这个参数是QCustomEvent类型的。你可以像前面介绍的重写event()函数的方法去重写这个函数:

void CustomWidget::customEvent(QEvent *event ) {
CustomEvent *customEvent = static_cast<CustomEvent *>(event );
// ....
}


另外,你也可以通过重写event()函数来处理自定义事件:

bool CustomWidget::event (QEvent *event ) {
if (event ->type() == MyCustomEventType) {
CustomEvent *myEvent = static_cast<CustomEvent *>(event );
// processing...
return true ;
}

return QWidget::event (event );
}


这两种办法都是可行的。

好了,至此,我们已经概略的介绍了Qt的事件机制,包括事件的派发、自定义等一系列的问题。下面的章节将继续我们的学习之路!

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/232314

分享到:
评论

相关推荐

    QT拖放事件之四:自定义拖放操作-利用QDrag来拖动完成数据的传输-案例demo

    通过`03_easyDragDropExample`案例,开发者可以学习如何结合`QDrag`和`QMimeData`实现自定义的拖放操作,提升用户界面的交互性。实践中,你可以根据具体需求调整拖放的视觉效果、数据格式以及处理逻辑,使得拖放操作...

    Qt实现的自定义tip

    通过阅读和学习这些代码,我们可以深入理解Qt自定义控件的原理,以及如何利用Qt的事件机制和绘图功能实现特定的UI效果。同时,这也是一个很好的实践案例,展示了如何在实际项目中扩展和定制Qt的基本功能。 总之,Qt...

    QT添加自定义控件

    ### QT添加自定义控件 #### 一、引言 在使用QT进行界面设计时,开发者往往会遇到标准控件库无法完全满足特定需求的情况。此时,实现自定义控件成为解决问题的有效途径之一。本文旨在详细介绍如何在QT环境中快速...

    QT学习之路2-2020整理版(更新到94章)(pdf)

    《QT学习之路2-2020整理版》是一份详尽的QT开发教程,涵盖了从基础到进阶的多个方面。这份资料基于豆子大佬的博客内容进行整理,不仅包含原有的79章,还增加了豆子在2016年3月11日后更新的15章内容,共计94章,旨在...

    Qt自定义按钮弹窗控件。

    通过以上知识点的学习和实践,开发者可以创建出具有独特风格和功能的Qt自定义按钮弹窗控件,提升应用的整体质量。而"PopupWidgetButton"很可能就是这样一个自定义控件的实现示例,包含了上述所有技术的应用。

    Qt自定义控件库.rar

    Qt自定义控件库是一个集合了多种自定义控件资源的压缩包,主要针对Qt开发平台,用于丰富和扩展Qt应用程序的用户界面。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动设备以及嵌入式系统的...

    《Qt 学习之路 2》

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

    Qt学习之路.pdf

    ### Qt学习之路知识点总结 #### 一、基础知识与入门 - **Hello, World!** - **知识点**:Qt环境搭建、第一个Qt程序编写、基本的窗口显示。 - **重要性**:作为Qt初学者的第一课,通过简单的示例程序帮助理解Qt的...

    Qt 学习之路:DZY

    ### Qt学习之路:核心知识点概览 #### 一、前言 - **Qt简介**:Qt是一个跨平台的C++图形用户界面应用程序开发框架。它不仅支持Windows、macOS、Linux等主流操作系统,还能用于开发嵌入式系统、移动设备应用(如...

    QT学习之路2+QT5教程+范例

    QT学习之路2+QT5教程+范例这个资料集合,显然是为了帮助初学者快速掌握QT开发技能,通过实例来深化理解。 首先,让我们关注《QT5教程 完整版.pdf》。这份文档应该详尽地介绍了QT5的各个方面,包括QT5的基础概念、...

    Qt自定义控件

    通过阅读和学习这些示例,开发者可以更好地理解和掌握自定义Qt控件的方法和技巧。这些代码实例通常会演示如何结合信号与槽机制、动画效果以及QPainter的高级功能来实现复杂且富有表现力的自定义界面元素。 总之,Qt...

    Qt 自定义导航栏

    在Qt开发中,自定义导航栏是一项常见的任务,它能够为应用程序提供更加直观且具有特色的用户界面。本文将深入探讨如何在Qt中实现自定义导航栏,并分享一个使用案例,帮助开发者创建美观、易用的树形导航结构。 首先...

    Qt5实现自定义标题栏

    在Qt开发中,自定义标题栏是一个常见的需求,它允许开发者根据应用的视觉风格和功能需求来定制窗口的顶部区域。Qt5作为一个强大的跨平台GUI工具包,提供了丰富的API和功能来实现这样的自定义。本篇文章将深入探讨...

    Qt学习之路

    ### Qt学习之路知识点详解 #### 一、二维画图中的坐标系统 在使用Qt进行图形绘制时,理解坐标系统的概念非常重要。主要涉及两种坐标系统: 1. **视口坐标系**: - 定义:相对物理设备或窗口组件的位置。 - 作用...

    Qt精美自定义控件 十套demo源码

    通过学习和实践这些自定义控件的源码,初学者能够掌握Qt的事件处理、绘图机制、样式设计和动画原理等核心技能。此外,对于更高级的开发者,这些源码也提供了优化性能、实现复杂交互或设计自定义UI组件的参考。不断...

    Qt学习之路2

    在深入探讨文档内容前,需明确“Qt学习之路2”这篇文档的主要目的是指导初学者如何学习和掌握Qt框架,这是一个广泛应用于软件开发中的跨平台C++图形用户界面应用程序框架。文档由Andy_Liu整理,包含了大量的章节,从...

    QT 自定义进度条实例

    总的来说,QT自定义进度条实例是一个很好的学习资源,它展示了QT如何通过其丰富的功能和灵活性来实现界面美化和用户体验的提升。开发者可以在此基础上进一步扩展,比如增加更多交互功能,或者将此进度条组件应用到...

    Qt 自定义 Button 之美

    "Qt 自定义 Button 之美" 主题深入探讨了如何利用 Qt 的强大功能来定制按钮,以满足个性化设计和功能扩展的要求。以下是关于这个主题的详细知识点: 1. **Qt 框架基础**:首先,理解 Qt 是一个跨平台的应用程序开发...

    Qt之自定义控件(开关按钮)自记

    在Qt框架中,自定义控件是扩展其功能和视觉表现的重要方式。本文将深入探讨如何创建...通过学习这个案例,开发者可以了解到Qt自定义控件的基本流程,以及如何将它们集成到设计环境中,提升软件的用户体验和界面美观度。

Global site tag (gtag.js) - Google Analytics