Qt_陰影效果


一、控件陰影效果

為子部件添加陰影比較簡單,使用如下方式:

QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);

shadow_effect->setOffset(-5, 5);

shadow_effect->setColor(Qt::gray);

shadow_effect->setBlurRadius(8);

network_group_box->setGraphicsEffect(shadow_effect);

    效果如下:

Qt之再談陰影邊框

二、 窗口陰影效果(代碼實現)

void DropShadowWidget::paintEvent(QPaintEvent *event)
{ 

    QPainterPath path;
    path.setFillRule(Qt::WindingFill);
    path.addRect(10, 10, this->width()-20, this->height()-20);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.fillPath(path, QBrush(Qt::white));

    QColor color(0, 0, 0, 50);
    for(int i=0; i<10; i++)
    {
        QPainterPath path;
        path.setFillRule(Qt::WindingFill);
        path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
        color.setAlpha(150 - qSqrt(i)*50);
        painter.setPen(color);
        painter.drawPath(path);
    }
}

  三、窗口陰影效果(圖片繪制)

 陰影邊框很常見,諸如360以及其他很多軟件都有類似效果,了解CSS3的同學們應該都知道box-shadow,它就是來設定陰影效果的,那么Qt呢?看過一些資料,說是QSS是基於CSS2的,既然如此,box-shadow是基於CSS3的!那么Qt定然就用不了!

  搜了一些資料,每張圖片都做成陰影效果的固然不可能,直接舍棄(即使可以,也不采納)。如果實時的去畫圖,效率太低,最后選擇了拼圖的方式!
Qt之陰影邊框
  效果如下:
  Qt之陰影邊框
Qt之陰影邊框
  左上角、左下角、右上角、右下角、上、下、左、右,這幾個方向都繪制對應的圖即可!
 
#include "shadow_widget.h"

ShadowWidget::ShadowWidget(QWidget *parent)
   : QDialog(parent)
{
   setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
   setAttribute(Qt::WA_TranslucentBackground);
}
ShadowWidget::~ShadowWidget()
{
}
void ShadowWidget::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   this->drawShadow(painter);
   painter.setPen(Qt::NoPen);
   painter.setBrush(Qt::white);
   painter.drawRect(QRect(SHADOW_WIDTH, SHADOW_WIDTH, this->width()-2*SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH));
}
void ShadowWidget::drawShadow(QPainter &painter)
{
   //繪制左上角、左下角、右上角、右下角、上、下、左、右邊框
   QList pixmaps;
   pixmaps.append(QPixmap(":/shadow/shadow_left"));
   pixmaps.append(QPixmap(":/shadow/shadow_right"));
   pixmaps.append(QPixmap(":/shadow/shadow_top"));
   pixmaps.append(QPixmap(":/shadow/shadow_bottom"));
   pixmaps.append(QPixmap(":/shadow/shadow_left_top"));
   pixmaps.append(QPixmap(":/shadow/shadow_right_top"));
   pixmaps.append(QPixmap(":/shadow/shadow_left_bottom"));
   pixmaps.append(QPixmap(":/shadow/shadow_right_bottom"));
   painter.drawPixmap(0, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[4]);
   painter.drawPixmap(this->width()-SHADOW_WIDTH, 0, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[5]);
   painter.drawPixmap(0,this->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[6]);
   painter.drawPixmap(this->width()-SHADOW_WIDTH, this->height()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[7]);
   painter.drawPixmap(0, SHADOW_WIDTH, SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH, pixmaps[0].scaled(SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH));
   painter.drawPixmap(this->width()-SHADOW_WIDTH, SHADOW_WIDTH, SHADOW_WIDTH, this->height()-2*SHADOW_WIDTH, pixmaps[1].scaled(SHADOW_WIDTH, this->height()- 2*SHADOW_WIDTH));
   painter.drawPixmap(SHADOW_WIDTH, 0, this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[2].scaled(this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));
   painter.drawPixmap(SHADOW_WIDTH, this->height()-SHADOW_WIDTH, this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH, pixmaps[3].scaled(this->width()-2*SHADOW_WIDTH, SHADOW_WIDTH));

}

  

轉自http://blog.sina.com.cn/s/blog_a6fb6cc90101eoc7.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM