QWindow重绘、避免闪烁

编程入门 行业动态 更新时间:2024-10-09 13:21:51

QWindow重绘、避免闪烁

QWindow重绘、避免闪烁

1.处理重绘事件的函数
QWindow的重绘与QWidget重绘有点不一样,QWindow的没有提供PaintEvent相关的函数,这个时候可以重写下面的虚函数,在里面对Paint事件进行处理:

[virtual protected] bool QWindow::event(QEvent *ev)

2.重绘的Painter
在QWindow中,获取一个QPainter对象可以通过QBackingStore.paintDevice进行获取;
实例如下:

bool event(QEvent * evt) {if (evt - > type() == QEvent::Expose || evt - > type() == QEvent::Resize) {QRect rect(QPoint(), geometry().size());m_backingStore.resize(rect.size());m_backingStore.beginPaint(rect);QPainter p(m_backingStore.paintDevice());p.setBrush(Qt::blue);p.drawEllipse(rect);m_backingStore.endPaint();m_backingStore.flush(rect);}return QWindow::event(evt);
}

3.避免闪烁
窗口在改变大小时,可能会产生闪烁,这时可以通过Spy++来查看窗口的窗口消息,看是哪些消息导致了闪烁(一般是WM_PAINT)。
通过Spy++查看消息可以发现窗口在拖动改变大小时会发生闪烁,是因为产生了WM_PAINT消息,在QML、Widget重绘之前,Window对窗口背景进行了重绘,而QML、Widget的重绘并没有那么快,所在会出现闪烁的情况。,在QT中捕获窗口的Window消息可以通过重写下面的函数来实现。

[virtual protected] bool QWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)

此处在处理WM_PAINT消息时应该处理调用BeginPaint()和EndPaint()函数,不然系统会一直重发WM_PAINT消息导致死循环崩溃,实例如下:

4.Mask
有时需要QWindow只显示一部分,这个时候可以通过setMask(QRegion)来实现,QRegion可以通过初始化为矩形,圆形,还可以使用vector装多个矩形的形式,这样就可以实现显示QWindow一部分的区域了。

更多推荐

QWindow重绘、避免闪烁

本文发布于:2024-03-11 20:54:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729871.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:QWindow

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!