Qt 界面重绘刷新机制

本文详细探讨了Qt窗口的绘制原理,强调了主线程在绘制中的作用以及processEvents()函数的重要性。paintEvent作为绘图事件,是进行重绘的核心。update和repaint分别在事件队列和立即执行上下文中触发重绘,而子窗口与父窗口的重绘关系可能导致不必要的性能消耗。QApplication::processEvents允许在执行过程中更新界面,避免用户界面假死。
摘要由CSDN通过智能技术生成

一、Qt 窗口绘制原理

最基本的原理是:绘制是在主线程中完成的。主线程是什么,可以理解为就是 main() 函数,main()函数最后需要调用 QApplication 的 exec() 函数,这个 exec() 里面是个死循环,每次循环调用一次 QApplication 的 processEvents(),这个函数负责处理窗口事件、用户消息,然后绘制窗口。就是说所有这些事都是在主线程中依次完成的,并不是同时进行,所以如果你在主线程中处理数据(比如响应按钮事件),你这个事件处理函数不返回,就不会往下走到绘制这一步。

窗口系统为了提高性能,会尽量减少绘制次数和范围,所以默认情况下,只有窗口内容显示出来的时候才进行一次绘制,包括窗口被遮挡的部分重新显现。

update 和 repaint 就是主动通知系统绘制窗口内容。区别在于:

  • update 只是在内部数据中做一个标记,要等到主线程进行到下一次绘制时才进行绘制,所以多次调用 update 是没有意义的,只是重复设置绘制标记,并不会马上进行绘制,而且同样要等到你的代码走完之后走到绘制时才能看到结果。
  • repaint虽然可以立即调用到 paintEvent,但是光有这个 paintEvent 还不够,不跑完整个 processEvents,缺少了界面响应,你的窗口就是个死的,看上去仍然不是实时显示。

二、paintEvent 绘图事件

paintEvent 是一个虚函数槽,子类可以对父类的 paintEvent 进行重写。paintEvent 是已经被高度优化过的函数,它本身已经自动开启并实现了双缓冲(X11 系统需要手动去开启双缓冲),因此 Qt 中重绘不会引起任何闪烁。pai

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值