QT 消息处理机制

Qt是一个事件驱动的框架,其事件类型多样,包括自发事件、发布事件和发送事件。事件来源于系统消息或Qt自身,通过事件循环进行处理。QCoreApplication的postEvent和sendEvent用于发布和发送事件,前者将事件放入队列,后者直接处理。事件派发过程中,会经过对象的事件过滤器,若事件未被处理,会向上转发给父窗口。文章还介绍了事件处理方法,如重写特定的事件处理函数或安装事件过滤器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt 事件系统 Qt是事件驱动的, 程序每个动作都是由某个事件所触发。 Qt事件的类型很多,我们可以通过查看Qt的 manual中的Event System 和 QEvent 来获得各个事件的详细信息。

为了完整起见,一份Qt4.6的事件列表附在本文后面。

事件来源
Spontaneous events(自发事件) 
从系统得到的消息,比如鼠标按键,键盘按键等。Qt事件循环的时候读取这些事件,转化为QEvent后依次处理
Posted events 
有Qt或应用程序产生,放入消息队列
QCoreApplication::postEvent()
Sent events 
由Qt或应用程序产生,不放入队列,直接被派发和处理
QCoreApplication::sendEvent()
比如考虑重绘事件处理函数 paintEvent(),3种事件都能使得该函数被调用:

当窗口被其他窗口覆盖后,再次重新显示时,系统将产生 spontaneous 事件来请求重绘
当我们调用 update() 时,产生的是 Posted 事件
当我们调用 repaint() 时,产生的是 Sent 事件
事件派发事件循环 while (!exit_was_called) {
while (!posted_event_queue_is_empty) {
process_next_posted_event();
}
while (!spontaneous_event_queue_is_empty) {
process_next_spontaneous_event();
}
while (!posted_event_queue_is_empty) {
process_next_posted_event();
}
}
先处理Qt事件队列中的事件,直至为空
再处理系统消息队列中的消息,直至为空
在处理系统消息的时候会产生新的Qt事件,需要对其再次进行处理
不通过事件循环
sendEvent的事件派发不通过事件循环。QApplication::sendEvent()是通过调用QApplication::notify(),直接进入了事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值