1、控件陰影效果html
爲子部件添加陰影比較簡單,使用以下方式:app
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);
效果以下:less
2、 窗口陰影效果(代碼實現)oop
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); } }
3、窗口陰影效果(圖片繪製)this
陰影邊框很常見,諸如360以及其餘不少軟件都有相似效果,瞭解CSS3的同窗們應該都知道box-shadow,它就是來設定陰影效果的,那麼Qt呢?看過一些資料,說是QSS是基於CSS2的,既然如此,box-shadow是基於CSS3的!那麼Qt定然就用不了!url
#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)); }