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

Qt學(xué)習(xí)教程之對(duì)話框消失動(dòng)畫效果

 更新時(shí)間:2018年07月18日 08:36:29   作者:1134024095  
這篇文章主要給大家介紹了關(guān)于Qt學(xué)習(xí)教程之對(duì)話框消失動(dòng)畫效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、效果展示

最近做了一個(gè)提示框消失的功能,覺著挺有意思,以前一直以為Qt子窗口不能做淡出效果,其實(shí)Qt的淡出功能已經(jīng)幫我們封裝好了,我們僅僅只需要幾行代碼就可以做出酷炫的窗口關(guān)閉效果,寫此篇文章的時(shí)候,我特意瀏覽了下之前寫的兩篇文章(QPainterPath 不規(guī)則提示框,QPainterPath 不規(guī)則提示框(二)),現(xiàn)在回想起來(lái)那會(huì)兒確實(shí)知之甚少,關(guān)于頂層窗口不能做圓角,其實(shí)幫助文檔里已經(jīng)說(shuō)的很明確,解決辦法有多種,一種是重寫paintEvent函數(shù),另一種是把widget包裝一層,本篇文章就用的是后一種方式,如圖1所示窗口關(guān)閉動(dòng)畫,實(shí)例程序中做了淡出、飛出、縮小等關(guān)閉窗口動(dòng)畫,除此之外還包含了陰影、背景著色、濾鏡等特效。

圖1 窗口特效

二、功能

如圖1窗口特效所示,實(shí)例中總共包含了4個(gè)groupbox,這4個(gè)groupbox是分別用來(lái)展示不同特效,下面分別講述4個(gè)groupbox

  • 背景色:主要針對(duì)窗口背景色進(jìn)行了定制,就像groupbox中按鈕文字那樣,是紅色和綠色的背景提示框,其中紅色提示框使用了最小化關(guān)閉效果,綠色提示框使用了淡出特效
  • 飛出:這4個(gè)按鈕彈出的對(duì)話框都使用了飛出特效,4個(gè)按鈕分別展示了4種飛出的方式(左、上、右、下)
  • 自定義:支持自定義提示框別景色、提示框展示時(shí)長(zhǎng)、消失動(dòng)畫時(shí)長(zhǎng)和消失模式
  • shortcut:主要是針對(duì)業(yè)務(wù)進(jìn)行的功能定制,warning提示框體的圖標(biāo)是進(jìn)行單獨(dú)處理的,是一個(gè)嘆號(hào)圖標(biāo)

三、代碼實(shí)現(xiàn)

在講解代碼之前,先來(lái)認(rèn)識(shí)幾個(gè)概念

  • QPropertyAnimation:屬性動(dòng)畫,可以參考qt 窗口動(dòng)畫
  • QGraphicsOpacityEffect:窗口透明度設(shè)置類,繼承自QGraphicsEffect
  • QGraphicsDropShadowEffect:窗口陰影,繼承自QGraphicsEffect
  • QGraphicsBlurEffect:濾鏡,繼承自QGraphicsEffect
  • QGraphicsColorizeEffect:著色,繼承自QGraphicsEffect

1、移出動(dòng)畫,使用屬性動(dòng)畫QPropertyAnimation類進(jìn)行,propertyname的參數(shù)是窗口的屬性,詳情參見Q_PROPERTY屬性 。targetObject對(duì)象設(shè)置為this內(nèi)部單獨(dú)封裝的widget,這樣做的目的使得該提示框不需要依賴其他窗口遮擋即可做出飛出效果

void GMPOperateTip::MoveOut()
{
 m_pAnimation->setTargetObject(m_pMoveWidget);
 m_pAnimation->setPropertyName("pos");

 m_pAnimation->setStartValue(QPoint());
 switch (m_eDirection)
 {
 case D_LEFT:
  m_pAnimation->setEndValue(QPoint(-width(), 0));
  break;
 case D_TOP:
  m_pAnimation->setEndValue(QPoint(0, -height()));
  break;
 case D_RIGHT:
  m_pAnimation->setEndValue(QPoint(width(), 0));
  break;
 case D_BOTTOM:
  m_pAnimation->setEndValue(QPoint(0, height()));
  break;
 default:
  ;
 }
}

2、淡出

m_pOpacity = new QGraphicsOpacityEffect(this);
m_pOpacity->setOpacity(1);

setGraphicsEffect(m_pOpacity);

m_pAnimation->setTargetObject(m_pOpacity);
m_pAnimation->setPropertyName("opacity");

m_pAnimation->setStartValue(1);
m_pAnimation->setEndValue(0);

3、最小化

m_pAnimation->setPropertyName("geometry");

QRect startRect = rect();
startRect.moveTo(pos());
QRect stopRect = QRect(startRect.center(), QSize(0, 0));

m_pAnimation->setStartValue(startRect);
m_pAnimation->setEndValue(stopRect);

4、動(dòng)畫啟動(dòng)機(jī)制

使用定時(shí)器控制動(dòng)畫,當(dāng)指定時(shí)間后啟動(dòng)動(dòng)畫,并且在動(dòng)畫完成后關(guān)閉窗口

void InitializeConnect()
{
 m_pAnimation = new QPropertyAnimation(this);
 m_pAnimation->setTargetObject(this);

 connect(m_pAnimation, &QPropertyAnimation::finished, this, &GMPOperateTip::close);

 connect(&m_StayTimer, &QTimer::timeout, this, [this]{
  m_pAnimation->setDuration(m_DurationTime);
  switch (m_eMode)
  {
  case AM_FADEOUT:
   FadeOut_p();
   break;
  case AM_FLYOUT:
   MoveOut();
   break;
  case AM_ZOOMIN:
   ZoomIn();
   break;
  default:
   ;
  }

  m_pAnimation->start();
 });
}

窗口顯示時(shí)啟動(dòng)定時(shí)器,并且將窗口隨機(jī)移動(dòng)到屏幕一個(gè)位置

bool event(QEvent * e)
{
 if (e->type() == QEvent::Show)
 {
  //QPoint pos = parentWidget()->rect().center() - this->rect().center();
  int wrand = qrand() % (parentWidget()->rect().width() - this->rect().width());
  int hrand = qrand() % (parentWidget()->rect().height() - this->rect().width());
  move(QPoint(wrand, hrand));

  m_StayTimer.start(m_iStayDuration);
 }

 return __super::event(e);
}

5、陰影

void setShadowEnable(bool enable)
{
 if (!m_pShadow)
 {
  m_pShadow = new QGraphicsDropShadowEffect(this);
  m_pShadow->setColor(QColor(0, 0, 0, 85));
  m_pShadow->setBlurRadius(10);
  m_pShadow->setOffset(4, 4);
 }

 setGraphicsEffect(enable ? m_pShadow : nullptr);
}

6、著色

注釋中的代碼也可以進(jìn)行著色,但是窗體的一些特殊樣式不能完成,因此使用stylesheet來(lái)完成背景色修改

 static const QString c_szStyleSheet = "QWidget{background-color:%1;\
          border:1px solid %2;border-top:0;border-bottom-left-radius:3px;\
          border-bottom-right-radius:3px;background-image: url();}";
void GMPOperateTip::setBackgroundColor(const QColor & color)
{
 //if (!m_pColorize)
 //{
 // m_pColorize = new QGraphicsColorizeEffect(this);
 // m_pColorize->setStrength(1);
 // 
 // setGraphicsEffect(m_pColorize);
 //}
 //m_pColorize->setColor(color);

 QColor border = color;
 border.setAlpha(255 * 0.1);
 QString borderRgba = QString("rgba(%1,%2,%3,%4)").arg(border.red()).arg(border.green()).arg(border.blue()).arg(border.alpha());
 setStyleSheet(c_szStyleSheet.arg(color.name()).arg(borderRgba));
}

 7、快捷調(diào)用接口,該接口都是類的靜態(tài)方法可以直接調(diào)用

8、測(cè)試,由于測(cè)試代碼較多,我只貼出2個(gè)

void tip::on_pushButton_success_clicked()
{
 GMPOperateTip::Success(this, QStringLiteral("測(cè)a試º?,ê?測(cè)a試º?"), 1000, 1000);
}

void tip::on_pushButton_warning_clicked()
{
 GMPOperateTip::Waring(this, QStringLiteral("測(cè)a試º?,ê?測(cè)a試º?"), 1000, 1000);
}

四、demo程序

動(dòng)畫提示框

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例

    c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例

    這篇文章主要介紹了c++實(shí)現(xiàn)逐行讀取配置文件寫入內(nèi)存的示例,需要的朋友可以參考下
    2014-05-05
  • c語(yǔ)言:基于函數(shù)指針的兩個(gè)示例分析

    c語(yǔ)言:基于函數(shù)指針的兩個(gè)示例分析

    本篇文章是對(duì)c語(yǔ)言中函數(shù)指針的兩個(gè)示例做了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 解讀C語(yǔ)言非void函數(shù)卻沒(méi)有return會(huì)怎么樣

    解讀C語(yǔ)言非void函數(shù)卻沒(méi)有return會(huì)怎么樣

    這篇文章主要介紹了解讀C語(yǔ)言非void函數(shù)卻沒(méi)有return會(huì)怎么樣的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • uboot添加自定義命令的實(shí)現(xiàn)步驟

    uboot添加自定義命令的實(shí)現(xiàn)步驟

    uboot 屬于bootloader的一種,是用來(lái)引導(dǎo)啟動(dòng)內(nèi)核的,它的最終目的就是從flash中讀出內(nèi)核,放到內(nèi)存中,啟動(dòng)內(nèi)核,這篇文章主要介紹了uboot添加自定義命令的實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2022-11-11
  • C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    本文主要介紹了適合當(dāng)圖像的直方圖具有明顯單峰特征時(shí)使用,結(jié)合了三角法的原理而設(shè)計(jì)的圖像分割方法,感興趣的小伙伴可以了解一下
    2021-12-12
  • gcc中extra qualification錯(cuò)誤的解決

    gcc中extra qualification錯(cuò)誤的解決

    今天小編就為大家分享一篇gcc中extra qualification錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作

    c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作

    這篇文章主要介紹了c/c++ 利用sscanf進(jìn)行數(shù)據(jù)拆分操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • QString使用正則操作的接口實(shí)現(xiàn)

    QString使用正則操作的接口實(shí)現(xiàn)

    這篇文章主要介紹了QString使用正則操作的接口實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • C語(yǔ)言中的遞歸,你真的懂了嗎?

    C語(yǔ)言中的遞歸,你真的懂了嗎?

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中遞歸的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C語(yǔ)言實(shí)現(xiàn)的階乘,排列和組合實(shí)例

    C語(yǔ)言實(shí)現(xiàn)的階乘,排列和組合實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的階乘,排列和組合的方法,涉及C語(yǔ)言數(shù)學(xué)運(yùn)算的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

上杭县| 乐山市| 巴彦县| 南丹县| 邛崃市| 元阳县| 博野县| 荆门市| 张北县| 武城县| 潼关县| 永泰县| 双鸭山市| 万荣县| 望城县| 定边县| 磐石市| 紫云| 彭泽县| 建昌县| 呼和浩特市| 新乡县| 卢氏县| 无棣县| 谷城县| 汕尾市| 茶陵县| 利辛县| 乌拉特前旗| 徐水县| 万源市| 涟水县| 砚山县| 万盛区| 平顺县| 轮台县| 始兴县| 包头市| 亚东县| 建昌县| 兴国县|