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重绘、避免闪烁
发布评论