【Qt】嵌入式开发控件阴影替代方案

最近在海思上用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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zanerogl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值