最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實現(xiàn)給窗口繪制陰影的示例代碼

 更新時間:2022年11月25日 09:52:11   作者:音視頻開發(fā)老舅  
這篇文章主要為大家詳細介紹了Qt實現(xiàn)給窗口繪制陰影的方法,文中的示例代碼講解詳細,對我們學習Qt有一定的幫助,感興趣的可以了解一下

前言

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

具體的方法有

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

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

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

重載paintEvent法

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

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

drawPath

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

繪制代碼如下:

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);
    // 此處循環(huán)次數(shù)為10,目的是繪制寬度為10的陰影
    for(int i=0; i<10; i++)
    {
        // 3. 初始化一個QPainterPath對象
        QPainterPath path;
        // 4. 設置填充規(guī)則
        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

這兩個函數(shù)分別是畫矩形陰影和畫帶圓角的陰影,除了最后繪制的時候鎖調(diào)用的函數(shù)不一樣,其余都是一樣的。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函數(shù)
  • iHorzSplit和iVertSplit這兩個變量分別代表對原始的圖片進行九宮格分之后的高和寬。
  • DstWidth和DstHeight這個兩個變量則代表最后需要的圖片的高和寬

如下圖:

到此這篇關于Qt實現(xiàn)給窗口繪制陰影的示例代碼的文章就介紹到這了,更多相關Qt窗口繪制陰影內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言超詳細講解結構體與聯(lián)合體的使用

    C語言超詳細講解結構體與聯(lián)合體的使用

    結構體和聯(lián)合體用于描述事物的屬性,如一只鳥的信息,可能包括它的品種,體重,顏色,年齡等,接下來大家一起來詳細看看吧
    2022-05-05
  • C++ LeetCode1805字符串不同整數(shù)數(shù)目

    C++ LeetCode1805字符串不同整數(shù)數(shù)目

    這篇文章主要為大家介紹了C++ LeetCode1805字符串不同整數(shù)數(shù)目,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)

    C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • c++函數(shù)名指針和函數(shù)指針

    c++函數(shù)名指針和函數(shù)指針

    這篇文章主要介紹了c++函數(shù)名指針和函數(shù)指針,函數(shù)指針和數(shù)據(jù)類似,C++當中函數(shù)也有地址,函數(shù)的地址是存儲函數(shù)機器語言代碼的內(nèi)存地址。我們可以將另外一個函數(shù)的地址作為參數(shù)傳入函數(shù),從而實現(xiàn)函數(shù)的靈活調(diào)用,下面詳細內(nèi)容需要的小伙伴可以參考一下
    2022-02-02
  • VScode中使用Cmake遇到的問題及其解決方法(推薦)

    VScode中使用Cmake遇到的問題及其解決方法(推薦)

    這篇文章主要介紹了VScode中使用Cmake遇到的問題及其解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • QT實現(xiàn)視頻傳輸功能

    QT實現(xiàn)視頻傳輸功能

    這篇文章主要為大家詳細介紹了QT實現(xiàn)視頻傳輸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • ??C++11系列學習之Lambda表達式

    ??C++11系列學習之Lambda表達式

    這篇文章主要介紹了??C++11系列學習之Lambda表達式,C++11終于也引入了lambda表達式,lambda最早來源于函數(shù)式編程,現(xiàn)代語言慢慢都引入了這個語法,下文關于??C++11Lambda表達式相關內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • C語言示例講解switch分支語句的用法

    C語言示例講解switch分支語句的用法

    這篇文章主要為大家介紹了switch語句,switch語句是我們常見會用到的結構,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • C++類與對象的基礎知識點詳細分析

    C++類與對象的基礎知識點詳細分析

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2023-02-02
  • C++之list容器介紹及使用方式

    C++之list容器介紹及使用方式

    這篇文章主要介紹了C++之list容器介紹及使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

南川市| 寿阳县| 班戈县| 昌图县| 柳州市| 都昌县| 深州市| 玛多县| 肥城市| 濉溪县| 乐陵市| 太原市| 台北市| 盐津县| 阳东县| 东宁县| 志丹县| 永平县| 保康县| 沙湾县| 河源市| 河南省| 巴里| 秭归县| 翁源县| 闸北区| 拜泉县| 萝北县| 乐至县| 二连浩特市| 汨罗市| 阳新县| 乌鲁木齐县| 教育| 胶州市| 阿拉尔市| 龙州县| 资溪县| 绍兴县| 咸阳市| 前郭尔|