希望大家慎用QGraphicsDropShadowEffect啊!!!
在本人开发一款简单的音乐播放器时,为了让无标题窗口有一定的立体感,在主窗口外面套了一层Qwidget(设置为透明),并在原来的widget上加载QGraphicsDropShadowEffect,实现窗口阴影效果,如下图:
实现代码片段如下:
QGraphicsDropShadowEffect* shadow=new QGraphicsDropShadowEffect(this);
shadow->setOffset(0,0);
shadow->setColor(Qt::black);
shadow->setBlurRadius(15);//设置阴影圆角
ui->widget_shadow->setGraphicsEffect(shadow);//QGraphicsEffect的子类只能在一个QWidget中安装一次 再次调用setGraphicsEffect时 之前安装的效果将被卸载
开发初期没什么问题,效果也很好。
但随后功能的增多使得问题暴露了出来(比如上图中使用滚轮滚动列表时):
cpu占用率高的惊人,而且这仅仅是最基础的功能而已。
后来经过分析认为,是有高刷新频率的控件使得重绘事件调用频率过高导致的,因此适当降低了滚动字幕的刷新频率。但cpu占用率仍居高不下,我为此苦恼了两周。
让我联想到了透明控件和effect使用过多的问题。
于是今天经尝试,10min解决了两周都没想出解决方案的问题!
实际解决方案:
1、少用透明背景,例如StyleSheet中的rgba(0,0,0,0);
2、尽量不要在父窗口/控件使用effect或animation;
目前尚不清楚QGraphicsDropShadowEffect在高刷新率导致cpu占用率高的原因,希望有大神能解释清楚!