QWidget属性为FramelessWindowHint导致界面刷新的问题及QWidget播放视频背景图片闪烁

本文介绍了解决Qt应用程序中界面刷新问题的方法,包括重写showEvent和changeEvent函数以确保窗口状态变化时界面能正确更新。此外,还讨论了在多窗口环境下播放多路视频时避免背景图片刷新导致的闪屏问题,通过重写paintEvent函数并优化背景绘制过程。

解决方法:

void BaseWindow::showEvent(QShowEvent *event)
{
#if QT_VERSION >= 0x050000
    this->setAttribute(Qt::WA_Mapped);
#endif
    QWidget::showEvent(event);
}

软件主窗口重新实现函数changeEvent,解决最小化之后界面不刷新问题:

void VRS::changeEvent(QEvent * event)
{
    //最小化之后再恢复到之前状态,界面会出现不update的问题,下面这段代码解决此问题 
    if( event->type() == QEvent::WindowStateChange)
    {
        this->setAttribute(Qt::WA_Mapped);  
    }
}

播放软件实现了多窗口同时播放多路视频。在切换不同的视频窗口时出现背景图片刷新闪屏。

播放视频的widget类派生自QWidget,重新实现paintEvent函数,绘制背景图片。

void CSSAWidget::paintEvent(QPaintEvent *)
{
    ////由于继承了QWidget,必须重载paintevent才能绘制背景
    QStyleOption opt;
    opt.initFrom(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    p.drawPixmap(0, 0, width(), height(), m_pixMapBG);//绘制背景
}
句柄直接传递给VC库,往往达不到效果,要使用下面的转换:
HWND temp = static_cast<HWND>((void*)playWidget->winId());

 

 

解决QWidget使用stylesheet设置背景后,播放视频时图像外界面背景格式偶发闪烁问题,可尝试以下方法: - **避免过度重绘背景**:对播放视频QWidget设置`widget->setAttribute(Qt::WA_OpaquePaintEvent)`,以此避免任何不必要的过度重绘背景;在视频播放时调用`widget->setUpdatesEnabled(false)`,播放结束之后调用`widget->setUpdatesEnabled(true)`,减少不必要的重绘,避免闪烁[^1]。 ```cpp // 设置避免过度重绘背景 widget->setAttribute(Qt::WA_OpaquePaintEvent); // 视频播放时禁用更新 widget->setUpdatesEnabled(false); // 视频播放结束后启用更新 widget->setUpdatesEnabled(true); ``` - **处理窗口状态改变**:若存在最小化之后界面刷新导致闪烁问题,可在播放软件主窗口重新实现`changeEvent`函数,当检测到窗口状态改变事件(`QEvent::WindowStateChange`)时,设置`this->setAttribute(Qt::WA_Mapped)`,解决最小化之后再恢复界面刷新问题,从而避免背景闪烁[^3]。 ```cpp void VRS::changeEvent(QEvent * event) { if (event->type() == QEvent::WindowStateChange) { this->setAttribute(Qt::WA_Mapped); } } ``` - **重新实现绘制事件**:若QWidget属性为`FramelessWindowHint`,可在播放视频的widget类派生自QWidget时,重新实现`paintEvent`函数来绘制背景图片,解决界面刷新问题,避免背景闪烁[^2]。 ```cpp void CSSAWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.initFrom(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); p.drawPixmap(0, 0, width(), height(), m_pixMapBG); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值