QPainter繪制的動(dòng)態(tài)Loading

1背景介紹

widget開(kāi)發(fā)中碟嘴,避免不了使用類(lèi)似網(wǎng)頁(yè)的那種等待加載頁(yè)面苇侵,該文檔記錄在Qt中基于widget開(kāi)發(fā)方式中Loading頁(yè)面的開(kāi)發(fā)

2.基于Widget的方式制作Loading頁(yè)面的三種方式

1.基于QLabel+QMovie方式著摔,必須有Loading頁(yè)的完整的gif圖,需要美工合成
2.基于QPainter+Pixmap()的方式泄伪,相當(dāng)于找一系列離散的Loading圖失都,用定時(shí)器控制在合適的時(shí)候繪制其中某一張,順序繪制出來(lái)的看起來(lái)就是一個(gè)Loading庙曙,這種方法比較簡(jiǎn)單(本文使用這種方法)
3.純手工繪制圖形和文本空镜,再使用旋轉(zhuǎn)坐標(biāo)系的方式執(zhí)行,一般不特殊處理這種繪制出來(lái)的效果比較差捌朴,因?yàn)檎麄€(gè)Loading都是勻速運(yùn)轉(zhuǎn)的姑裂,放棄這種方法,很麻煩男旗,又不好看

2.1 核心代碼展示

本代碼基于單獨(dú)的Widget制作舶斧,后期如果需要使用,需要在designer中布局一個(gè)普通的QWidget對(duì)象察皇,然后使用提升茴厉,便可以使用。

2.2頭文件定義
#ifndef WIDGET_H

#define WIDGET_H
#include <QWidget>
#include <QTimer>
#include <QPainter>
#include <QPaintEvent>
#include <QPixmap>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
     Q_OBJECT
public:
     Widget(QWidget *parent = nullptr);
     ~Widget();
public:
     void startLoading(); //啟動(dòng)定時(shí)器并顯示Loading頁(yè)面
     void endLoading();  //關(guān)閉定時(shí)器并隱藏loading頁(yè)面
protected:
      void paintEvent(QPaintEvent *event) override;
private:
     Ui::Widget *ui;
     QTimer *mTimer;
     QList<QPixmap> mPixmap; //保存loading圖片的集合
     quint8 mIndex = 0;
};
#endif // WIDGET_H
2.3源文件定義
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_TranslucentBackground);
    setWindowFlag(Qt::FramelessWindowHint);
    mTimer = new QTimer(this);
    connect(mTimer,&QTimer::timeout,this,[=](){
    mIndex++;
    if(mIndex>49)
    mIndex = 0;
    update();
});
    resize(320,320);
    for(int i = 0; i < 50; i++){
    mPixmap.push_back(QPixmap(QString(":/loading/%1.png").arg(i+1)));
    }
    startLoading();
    move(1920+50,150); //為了截圖方便什荣,show在一個(gè)比較純背景的地方
}

Widget::~Widget()
{
    delete ui;
}
void Widget::startLoading()
{
    if(!mTimer->isActive())
    mTimer->start(40);
    show();
}
void Widget::endLoading()
{
    if(mTimer->isActive())
    mTimer->stop();
    hide();
}
void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter Paint(this);
    Paint.setRenderHints(QPainter::TextAntialiasing |QPainter::Antialiasing);
    Paint.drawPixmap(QRect(0,0,320,320),QPixmap(mPixmap[mIndex]));
}
2.4源文件描述
  1. resize當(dāng)前窗體為320*320矾缓,因?yàn)槊拦で械膱D是320px的圖,因此重置窗體的大小為320px
  2. for(int i = 0; i < 50; i++){mPixmap.push_back(QPixmap(QString(":/loading/%1.png").arg(i+1)));}給容器中添加切好的圖稻爬,圖片名為1..2...3.png嗜闻,便于使用代碼插入

3.效果預(yù)覽

GUI_Loading.gif

小知識(shí)分享

1.設(shè)置窗體無(wú)背景,可以有兩種方式桅锄,第一種setAttribute(Qt::WA_TranslucentBackground);的方式琉雳,第二種是使用樣式setStyleSheet("background:transparent;")來(lái)設(shè)置,一般前者是搭配QPainter繪制友瘤,后者可以讓當(dāng)前窗體的父窗體的背景透出來(lái)(不使用當(dāng)前窗體的背景遮蓋父窗體的背景)翠肘,使用前者不加繪制,窗體會(huì)變黑窗
2.定時(shí)器的兩種使用方式辫秧,第一種是實(shí)例化QTimer對(duì)象束倍,之后startTimer(),在TimeOut中處理,第二種是直接在類(lèi)內(nèi)部startTime()啟動(dòng)定時(shí)器,返回當(dāng)前啟動(dòng)的定時(shí)器的TimerId,記錄該TimerId,在窗體析構(gòu)時(shí)關(guān)閉定時(shí)器killTimer(TimerId)

有什么問(wèn)題可以在線(xiàn)討論绪妹,覺(jué)得有用幫忙點(diǎn)個(gè)贊吧甥桂!^ _ ^

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邮旷,隨后出現(xiàn)的幾起案子格嘁,更是在濱河造成了極大的恐慌,老刑警劉巖廊移,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糕簿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狡孔,警方通過(guò)查閱死者的電腦和手機(jī)懂诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)苗膝,“玉大人殃恒,你說(shuō)我怎么就攤上這事∪杞遥” “怎么了离唐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)问窃。 經(jīng)常有香客問(wèn)我亥鬓,道長(zhǎng),這世上最難降的妖魔是什么域庇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任嵌戈,我火速辦了婚禮,結(jié)果婚禮上听皿,老公的妹妹穿的比我還像新娘熟呛。我一直安慰自己,他們只是感情好尉姨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布庵朝。 她就那樣靜靜地躺著,像睡著了一般又厉。 火紅的嫁衣襯著肌膚如雪九府。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天馋没,我揣著相機(jī)與錄音昔逗,去河邊找鬼降传。 笑死篷朵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播声旺,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼笔链,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腮猖?” 一聲冷哼從身側(cè)響起鉴扫,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澈缺,沒(méi)想到半個(gè)月后坪创,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姐赡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年莱预,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项滑。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡依沮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枪狂,到底是詐尸還是另有隱情危喉,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布州疾,位于F島的核電站辜限,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏严蓖。R本人自食惡果不足惜列粪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谈飒。 院中可真熱鬧岂座,春花似錦、人聲如沸杭措。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)手素。三九已至鸳址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泉懦,已是汗流浹背稿黍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崩哩,地道東北人巡球。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓言沐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酣栈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子险胰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 事情的起因需要從一只蝙蝠說(shuō)起,那是2020年過(guò)年時(shí)矿筝,沒(méi)有攜帶所有娛樂(lè)性工具的我回到老家后起便,經(jīng)過(guò)麻將、電影...
    soulcoder閱讀 1,222評(píng)論 0 0
  • 前言 大家好窖维,我是小張~ 記得小時(shí)候榆综,家里只有一個(gè)鐘表用來(lái)看時(shí)間(含有時(shí)針、分針铸史、秒針的那種)奖年,掛在墻上噠噠噠響個(gè)...
    小張Python閱讀 538評(píng)論 0 0
  • 十二、JavaScript的DOM特效 在web瀏覽器上沛贪,window對(duì)象是一個(gè)全局對(duì)象陋守,代表web瀏覽器中一個(gè)打...
    劉遠(yuǎn)舟閱讀 370評(píng)論 0 1
  • 簡(jiǎn)述 圖形視圖(Graphics View)提供了一個(gè)平臺(tái),用于大量自定義2D圖元的管理與交互利赋,并提供了一個(gè)視圖部...
    YBshone閱讀 5,305評(píng)論 0 5
  • web瀏覽器中的JavaScriptweb瀏覽器中的js通常稱(chēng)為客戶(hù)端的JavaScript 客戶(hù)端 JavaSc...
    小小小8021閱讀 427評(píng)論 0 1