日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt實現給窗口繪制陰影的示例代碼_C 語言

作者:音視頻開發老舅 ? 更新時間: 2022-12-24 編程語言

前言

最近自定義一個消息彈框,但是沒加陰影之前,覺得有點扁平。然后仔細看了Qt自帶的消息彈框,發現是沒有加上陰影的問題。所以就在網上搜索怎么加陰影,有多種方法。寫這個博客的目的是記錄一下這幾種方法,并且加上我對于這些方法的理解。

具體的方法有

  • 重載paintEvent,調用drawRect或者drawRoundedRect或者drawPath來手繪陰影
  • 使用QGraphicsDropShadowEffect類,來繪制陰影
  • 使用九圖拼湊法
  • 九宮格縮放陰影法

但是不管是哪種方法,都需要設置窗口的背景透明

    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setAttribute(Qt::WA_TranslucentBackground);

重載paintEvent法

這個方法就是重載paintEvent,然后自己設置繪圖的區域,根據陰影的大小、根據陰影的顏色,一圈一圈的去畫陰影。

然后又分有三個函數來進行陰影的繪制

drawPath

這個函數的作用是繪制一個路線,路線可以由很多不同的曲線或者直線組成,這個可以繪制多邊形。

繪制代碼如下:

void Waiting::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
 
    // 1. 初始化一個QPainter對象用來繪制
    // 2. QPainter::Antialiasing,讓引擎盡可能的消除鋸齒
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
 
    QColor color(0, 0, 0, 50);
    // 此處循環次數為10,目的是繪制寬度為10的陰影
    for(int i=0; i<10; i++)
    {
        // 3. 初始化一個QPainterPath對象
        QPainterPath path;
        // 4. 設置填充規則
        path.setFillRule(Qt::WindingFill);
        // 5. 添加一個矩形
        path.addRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
        // 6. 設置顏色的透明度
        color.setAlpha(150 - qSqrt(i)*50);
        painter.setPen(color);
        // 7. 繪制線路
        painter.drawPath(path);
    }
}

繪制效果如下:

Tips

drawRect和drawRoundedRect

這兩個函數分別是畫矩形陰影和畫帶圓角的陰影,除了最后繪制的時候鎖調用的函數不一樣,其余都是一樣的。drawRect是繪制矩形的,drawRoundedRect是繪制帶圓角的。

代碼如下:

void Waiting::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
 
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
 
    QColor color(0, 0, 0, 50);
    for(int i=0; i<10; i++)
    {
        color.setAlpha(150 - qSqrt(i)*50);
        painter.setPen(color);
        // drawRect 繪制矩形
//        painter.drawRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2);
        // drawRoundedRect 繪制帶原角
        painter.drawRoundedRect(10-i, 10-i, this->width()-(10-i)*2, this->height()-(10-i)*2, 20, 20);
    }
}

效果圖如下:

QGraphicsDropShadowEffect方法

這個類就直接用就好了,代碼如下:

m_pEffect = new QGraphicsDropShadowEffect(m_background);
m_pEffect->setOffset(0, 0);
m_pEffect->setColor(QColor(QStringLiteral("black")));
m_pEffect->setBlurRadius(30);
m_background->setGraphicsEffect(m_pEffect);

Tips

setOffser這個是設置陰影的起始點位于窗口的哪個位置setBlurRadius這個是設置陰影的模糊程度,越大就越模糊

具體對比請看下圖:

九宮格縮放陰影法

Tips:

  • ninePatchScalePixmap函數
  • iHorzSplit和iVertSplit這兩個變量分別代表對原始的圖片進行九宮格分之后的高和寬。
  • DstWidth和DstHeight這個兩個變量則代表最后需要的圖片的高和寬

如下圖:

原文鏈接:https://blog.csdn.net/m0_60259116/article/details/128026221

欄目分類
最近更新