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一部分的区域了。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值