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

本文详细介绍了Qt中自定义事件的实现方法,包括事件类型的定义、注册与使用,以及如何发送和处理这些事件。读者将了解到自定义事件与信号槽的区别,掌握事件过滤等高级特性。
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 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

[混合波束成形]基于深度学习的大规模天线阵列混合波束成形设计(Matlab代码、Python代码实现)内容概要:本文介绍了基于深度学习的大规模天线阵列混合波束成形的设计方法,并提供了Matlab和Python代码实现。该设计聚焦于5G及未来通信系统中的关键使能技术——混合波束成形,通过深度神经网络对复杂的信道状态信息(CSI)进行高效估计与波束成形矩阵优化,在保证通信性能的同时降低硬件成本与计算开销。文中详细阐述了算法模型构建、训练流程设计及仿真验证过程,展示了深度学习在通信物理层中的深度融合应用,尤其适用于毫米波大规模MIMO系统场景。; 适合人群:具备通信工程、信号处理或人工智能基础知识的研究生、科研人员及从事5G/6G技术研发的工程师;熟悉Matlab或Python编程,对深度学习和无线通信系统有一定实践经验者更为适宜。; 使用场景及目标:①研究深度学习在无线通信物理层中的应用,特别是CSI反馈压缩与波束成形优化;②复现先进混合波束成形算法,提升系统频谱效率与能效;③为学术论文复现、课题研究或工程项目开发提供可运行的代码参考与技术路线支持。; 阅读建议:建议读者结合文中提供的代码逐模块分析,重点关注神经网络结构设计与通信约束条件的融合方式,同时可扩展尝试不同网络架构或信道模型以深化理解。
STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动内容概要:本文档为一份名为《STM32电机库无感代码注释无传感器版本龙贝格观测三电阻双AD采样前馈控制弱磁控制斜坡启动》的技术资料,主要围绕基于STM32的永磁同步电机(PMSM)无传感器矢量控制系统的实现展开,详细注解了采用龙贝格观测器(Luenberger Observer)进行转子位置与速度估算的控制算法,涵盖三电阻采样、双通道ADC数据采集、电流环前馈补偿、弱磁扩速控制及斜坡启动策略等关键技术模块。该文档不仅提供了完整的控制逻辑说明,还深入解析了底层代码实现,适用于高精度、高性能电机控制系统的开发与学习。; 适合人群:具备一定嵌入式开发基础和电机控制理论知识的电气工程、自动化、机电一体化等相关专业的高校师生、科研人员及从事电机驱动开发的工程师;尤其适合希望深入理解无传感器电机控制算法及STM32平台实现的技术人员。; 使用场景及目标:①学习和掌握基于龙贝格观测器的无传感器电机控制原理与实现方法;②理解三电阻采样、双AD同步采集、前馈控制、弱磁控制和斜坡启动等关键环节的设计思路与代码实现;③用于高校课程设计、毕业设计、科研项目开发或工业级电机控制器的研发参考。; 阅读建议:建议读者结合STM32开发环境和电机控制实验平台进行代码阅读与调试,配合电机控制理论教材逐步理解各模块功能,重点关注观测器设计、坐标变换、PI调节器参数整定及ADC采样时序等核心部分,以实现理论与实践的有效结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值