發現一篇好文,利用 QGraphicsDropShadowEffect 可快速給原先沒有陰影的窗口加上陰影,快速方便,不費勁。
原文地址:https://blog.csdn.net/tonny7501/article/details/81748294
之前在網上找了很多資料來實現無邊框窗口的陰影, 發現不是複雜就是效果不好, 比如圖片形式, 只要擴大質量就會嚴重失真, 會弄瘋我們這些強迫症的, 利用純代碼繪畫出陰影, 絕對不適合新手和沒有繪畫細胞的我們, 既然Qt自帶陰影效果, 幹嘛不直接用呢? 話不多說, 開擼!
實現原理:
QWidget互相嵌套, 以一個窗口QWidget作爲陰影的畫板, 嵌套QWidget設置陰影(是不是特別簡單呢?)
步驟:
- 第一步, 先按照如圖自己在
ui
界面創建對應widget
, 並進行垂直佈局, 佈局器更名:lay_bg
。
就是在原有的佈局最外層加一個背景 QWidget
(如果原有的窗體本來就有無需另外創建),然後這個背景 QWidget
就屬於 lay_bg
中唯一的控件。
- 第二步: 寫陰影
//陰影類包含頭文件
#include <QGraphicsDropShadowEffect>
//窗體構造函數中
BgWidget::BgWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::BgWidget)
{
ui->setupUi(this);
//設置窗體透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
//設置無邊框
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
//實例陰影shadow
GraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
//設置陰影距離
shadow->setOffset(0, 0);
//設置陰影顏色
shadow->setColor(QColor("#444444"));
//設置陰影圓角
shadow->setBlurRadius(30);
//給嵌套QWidget設置陰影
ui->widget_bg->setGraphicsEffect(shadow);
//給垂直佈局器設置邊距(此步很重要, 設置寬度爲陰影的寬度)
ui->lay_bg->setMargin(24);
}
做到此步,你想要的陰影效果就實現了,看下圖
是不是非常簡單呢, 即不需要重寫paintEvent
函數, 也不需要自己先作圖或者調用那複雜的系統接口。
圖中的圓角很簡單,設置下widget_bg
的樣式就好了, 如果想要半透明的效果, 背景色加上透明通道就好了(rgba).
注意:
如果想要做成最大化的話,點擊最大化按鈕之後設置下lay_bg的邊距爲0就好了!
這個陰影已經夠日常生活了, 如果覺得陰影太窄, 就去Qt研究下QGraphicsDropShadowEffect
這個類吧