最近在海思上用Qt做一个界面时,发现当给窗口添加阴影(QGraphicsDropShadowEffect)时,鼠标移动到该窗口上的部分控件上会出现非常明显的卡顿,经查阅是阴影导致的CPU占用过高。
于是就着手查找QGraphicsDropShadowEffect的替代方案。
具体实现如下:
void BaseLayer::mouseMoveEvent(QMouseEvent *e) {
int x = e->pos().x(); // 获取鼠标位置
if(x < 10) {
// m_leftMenu->popOut();
m_leftMenu->show_();
this->update(QRect(m_leftMenu->x()-10, m_leftMenu->y()-10, m_leftMenu->width()+2*10, m_leftMenu->height()+2*10).adjusted(-10, -10, 10, 10));
} else if(x > m_leftMenu->width()+10 && m_leftMenu->status() == LeftMenu::Showing) {
// m_leftMenu->popIn();
m_leftMenu->hide_();
this->update(QRect(0, (height()/2)-(m_leftMenu->height()/2)-10, m_leftMenu->width()+2*20, m_leftMenu->height()+2*20).adjusted(-10, -10, 10, 10));
}
if(width()-10<x && x<width()) {
// m_rightMenu->popOut();
m_rightMenu->show_();
this->update(QRect(m_rightMenu->x()-10, m_rightMenu->y()-10, m_rightMenu->width()+2*10, m_rightMenu->height()+2*10).adjusted(-10, -10, 10, 10));
} else if(x < width()-m_rightMenu->width() && m_rightMenu->status() == RightMenu::Showing) {
// m_rightMenu->popIn();
m_rightMenu->hide_();
this->update(QRect(width()-m_rightMenu->width()-10, (height()/2)-(m_rightMenu->height()/2), m_rightMenu->width()+2*20, m_rightMenu->height()+2*20).adjusted(-10, -10, 10, 10));
}
int y = e->pos().y();
if(y>this->height()-30) {
m_toolBar->popOut();
// m_toolBar->show_();
this->update(QRect(m_toolBar->x(), height()-m_toolBar->height()-10, m_toolBar->width()+2*10, m_toolBar->height()+2*10).adjusted(-10, -10, 10, 10));
} else if(y<this->height()-m_toolBar->height()-30 && m_toolBar->status() == ToolBar::Showing) {
m_toolBar->popIn();
// m_toolBar->hide_();
this->update(QRect(m_toolBar->x(), height()-m_toolBar->height()-10, m_toolBar->width()+2*10, m_toolBar->height()+2*10).adjusted(-10, -10, 10, 10));
}
QWidget::mouseMoveEvent(e); // 调用基类方法
}
void BaseLayer::paintEvent(QPaintEvent *event) {
Q_UNUSED(event)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int shadowWidth = 30;
QColor color(10, 10, 10, 50);
if(m_leftMenu->status()==LeftMenu::Showing) {
for (int i = 0; i < shadowWidth; i++) { //当 i 从 0 增加时,透明度从 120 逐渐减少到 0,从而产生一种渐变的阴影效果
int alpha = 120 - static_cast<int>(pow(i, 0.5) * 40);
alpha = qMax(alpha, 0); // 确保alpha值不小于0
color.setAlpha(alpha);
painter.setPen(color);
painter.drawRoundedRect(m_leftMenu->x()-i, m_leftMenu->y()-i, m_leftMenu->width()+2*i,
m_leftMenu->height()+2*i, 15, 15); // 圆角阴影边框;
}
}
if(m_rightMenu->status()==RightMenu::Showing) {
for (int i = 0; i < shadowWidth; i++) { //当 i 从 0 增加时,透明度从 120 逐渐减少到 0,从而产生一种渐变的阴影效果
int alpha = 120 - static_cast<int>(pow(i, 0.5) * 40);
alpha = qMax(alpha, 0); // 确保alpha值不小于0
color.setAlpha(alpha);
painter.setPen(color);
painter.drawRoundedRect(m_rightMenu->x()-i, m_rightMenu->y()-i, m_rightMenu->width()+2*i,
m_rightMenu->height()+2*i, 15, 15); // 圆角阴影边框;
}
}
if(m_toolBar->status()==ToolBar::Showing) {
for (int i = 0; i < shadowWidth; i++) { //当 i 从 0 增加时,透明度从 120 逐渐减少到 0,从而产生一种渐变的阴影效果
int alpha = 120 - static_cast<int>(pow(i, 0.5) * 40);
alpha = qMax(alpha, 0); // 确保alpha值不小于0
color.setAlpha(alpha);
painter.setPen(color);
painter.drawRoundedRect(m_toolBar->x()-i, m_toolBar->y()-i, m_toolBar->width()+2*i,
m_toolBar->height()+2*i, 15, 15); // 圆角阴影边框;
}
}
}
效果展示


代码逻辑解释:鼠标移动到特定位置后弹出菜单栏或工具栏,在其显示区域处由内到外绘制若干个颜色逐渐变淡的圆角矩形,从而实现阴影效果。
QGraphicsDropShadowEffect 效果
QGraphicsDropShadowEffect * effect = new QGraphicsDropShadowEffect(this);
effect->setOffset(0, 0);//设置阴影距离
effect->setColor(QColor(0,0,0,255));//设置阴影颜色
effect->setBlurRadius(20);//设置阴影圆角
this->setGraphicsEffect(effect);


看着差不多
参考
https://blog.youkuaiyun.com/qianniulaoren/article/details/145834980
https://blog.youkuaiyun.com/LHLKEVIN0713/article/details/121802797
https://blog.youkuaiyun.com/GoForwardToStep/article/details/99549750
1万+

被折叠的 条评论
为什么被折叠?



