Qt自定義進(jìn)度條

瞎扯

轉(zhuǎn)眼已經(jīng)折騰Qt(畫圖軟件23333)快5個月了,C++的東西沒學(xué)到多少遍希,各種軟件繪圖技巧倒是折騰了不少等曼。在剛開始工作的時候看到設(shè)計稿的軟件界面還是一臉懵逼的凿蒜,現(xiàn)在發(fā)現(xiàn)沒有什么是Qt的paint()和PS解決不了的,如果有废封,再加個Ae~ o( ̄▽ ̄)ブ

簡介

在需要按比例顯示數(shù)據(jù)的時候,進(jìn)度條是必不可少的漂洋。Qt中有一個進(jìn)度條相關(guān)的類QProgressBar,這個類提供了簡單的水平或垂直的進(jìn)度條刽漂,可以通過修改qss簡單的改變下樣式:


自帶進(jìn)度條

簡單使用的話自帶的樣式就夠看了,但是也有時候設(shè)計非要搞些酷炫的效果贝咙,沒辦法只能折騰下了......比如,設(shè)計稿非要整個兩端橢圓的進(jìn)度條庭猩,qss就沒轍了窟她。這篇文章主要總結(jié)下Qt在繪制控件方面的經(jīng)驗蔼水,畫都能畫出來了,其他騷操作就隨便搞了徙缴,下面是折騰出來的栗子:


各種進(jìn)度條

各種進(jìn)度條

重繪paint之兩端圓角進(jìn)度條(繼承QProgressbar)

圖中第一個,其實也可以直接繼承QWidget的于样,就少寫個設(shè)置百分比和最小最大值的函數(shù),主要還是重寫paint函數(shù)穿剖,畫出進(jìn)度條底圖和根據(jù)當(dāng)前value值畫出藍(lán)色進(jìn)度條:

void RadiusProgressBar::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    QRect rect = QRect(0, 0, width(), height()/2);
    QRect textRect = QRect(0, height()/2, width(), height()/2);

    const double k = (double)(value() - minimum()) / (maximum()-minimum());
    int x = (int)(rect.width() * k);
    QRect fillRect = rect.adjusted(0, 0, x-rect.width(), 0);

    QString valueStr = QString("%1%").arg(QString::number(value()));
    QPixmap buttomMap = QPixmap(":/resource/radius_back.png");
    QPixmap fillMap = QPixmap(":/resource/radius_front.png");

    //畫進(jìn)度條
    p.drawPixmap(rect, buttomMap);
    p.drawPixmap(fillRect, fillMap, fillRect);

    //畫文字
    QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
    p.setFont(f);
    p.setPen(QColor("#555555"));
    p.drawText(textRect, Qt::AlignCenter, valueStr);
}

重繪paint之純色圓環(huán)進(jìn)度條(繼承QWidget)

圖中第二個,這是單純用程序畫出來的糊余,沒有貼圖秀又,在畫出底圖的圓以及上層的圓弧后,在上層再畫一個透明的圓吐辙,相當(dāng)于遮罩:

void RingsProgressbar::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing);

    m_rotateAngle = 360*m_persent/100;

    int side = qMin(width(), height());
    QRectF outRect(0, 0, side, side);
    QRectF inRect(20, 20, side-40, side-40);
    QString valueStr = QString("%1%").arg(QString::number(m_persent));

    //畫外圓
    p.setPen(Qt::NoPen);
    p.setBrush(QBrush(QColor(97, 117, 118)));
    p.drawEllipse(outRect);
    p.setBrush(QBrush(QColor(255, 107, 107)));
    p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
    //畫遮罩
    p.setBrush(palette().window().color());
    p.drawEllipse(inRect);
    //畫文字
    QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
    p.setFont(f);
    p.setFont(f);
    p.setPen(QColor("#555555"));
    p.drawText(inRect, Qt::AlignCenter, valueStr);
}

重繪paint之貼圖圓環(huán)進(jìn)度條(繼承QWidget)

圖中第三個,在玩第二種進(jìn)度條的時候尊沸,意外發(fā)現(xiàn)drawPie()設(shè)置筆刷后可以直接畫圓弧,這種騷操作 不試試還真不知道:

void RingsMapProgressbar::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing);

    m_rotateAngle = 360*m_persent/100;

    int side = qMin(width(), height());
    QRectF outRect(0, 0, side, side);
    QRectF inRect(20, 20, side-40, side-40);
    QString valueStr = QString("%1%").arg(QString::number(m_persent));

    //畫底圓
    p.setPen(Qt::NoPen);
    QPixmap backMap = QPixmap(":/resource/progress_back.png");
    p.drawPixmap(outRect, backMap, outRect);
    //畫內(nèi)弧
    QPixmap frontMap = QPixmap(":/resource/progress_front.png");
    p.setBrush(QBrush(frontMap));
    p.drawPie(outRect, (90-m_rotateAngle)*16, m_rotateAngle*16);
    //畫文字
    QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
    p.setFont(f);
    p.setPen(QColor("#DDDDDD"));
    p.drawText(inRect, Qt::AlignCenter, valueStr);
}

重繪paint之屬性動畫進(jìn)度條(繼承QWidget)

圖中第4個洼专,上面3個都是用程序控制顯示進(jìn)度的,最后一個是直接將進(jìn)度條動畫導(dǎo)出成序列幀圖片屁商,播放動畫的形式來畫進(jìn)度條。這種方式主要是在某些等待操作以及需要進(jìn)度條動畫有曲線的時候用的蜡镶,前提是你要會做動畫和導(dǎo)出序列幀哦(⊙o⊙):

AnimationProgressbar::AnimationProgressbar(QWidget *parent) : QWidget(parent),
    m_animaindex(0),
    m_animaTotal(30),
    m_persent(0)
{
    QPixmap aniMap(":/resource/sequence_animate.png");

    for(int i=0; i<m_animaTotal; i++){
        m_animalist << aniMap.copy(i*(aniMap.width()/m_animaTotal), 0, aniMap.width()/m_animaTotal, aniMap.height());
    }

    m_animation=new QPropertyAnimation(this,"");
    m_animation->setStartValue(0);
    m_animation->setEndValue(m_animaTotal - 1);
    m_animation->setDuration(2000);
    m_animation->setLoopCount(-1);
    connect(m_animation,SIGNAL(valueChanged(QVariant)),this,SLOT(slot_valuechange(QVariant)));
}

void AnimationProgressbar::startAnimation()
{
    update();

    m_animation->start();
}

void AnimationProgressbar::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.setRenderHint(QPainter::SmoothPixmapTransform);

    int side = qMin(width(), height());
    QRect outRect(0, 0, side, side);
    QRect inRect(20, 20, side-40, side-40);
    QString valueStr = QString("%1%").arg(QString::number(m_persent));

    //畫圓環(huán)
    p.drawPixmap(outRect, m_animalist.at(m_animaindex));

    //畫文字
    QFont f = QFont("Microsoft YaHei", 15, QFont::Bold);
    p.setFont(f);
    p.setPen(QColor("#555555"));
    p.drawText(inRect, Qt::AlignCenter, valueStr);
}

void AnimationProgressbar::slot_valuechange(QVariant var)
{
    m_animaindex = var.toInt();
    m_persent = m_animaindex*100 / m_animaTotal;

    update();
}

進(jìn)度條栗子

代碼倉庫在這里->Github鏈接地址精盅,喜歡的話點下star哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叹俏,隨后出現(xiàn)的幾起案子僻族,更是在濱河造成了極大的恐慌粘驰,老刑警劉巖述么,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異度秘,居然都是意外死亡顶伞,警方通過查閱死者的電腦和手機(jī)剑梳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢乙,“玉大人,你說我怎么就攤上這事追逮〈舛妫” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵眼滤,是天一觀的道長。 經(jīng)常有香客問我柠偶,道長,這世上最難降的妖魔是什么睬关? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蔫仙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丐箩。我一直安慰自己,他們只是感情好屎勘,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著概漱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓤摧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天照弥,我揣著相機(jī)與錄音,去河邊找鬼这揣。 笑死悔常,一個胖子當(dāng)著我的面吹牛给赞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塞俱,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼障涯!你這毒婦竟也來了膳汪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遗嗽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鼓蜒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡都弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冯痢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡浦楣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咪辱,到底是詐尸還是另有隱情,我是刑警寧澤油狂,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布历恐,位于F島的核電站选调,受9級特大地震影響夹供,放射性物質(zhì)發(fā)生泄漏仁堪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一弦聂、第九天 我趴在偏房一處隱蔽的房頂上張望氛什。 院中可真熱鬧莺葫,春花似錦、人聲如沸捺檬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聂受。三九已至烤镐,卻和暖如春蛋济,著一層夾襖步出監(jiān)牢的瞬間炮叶,已是汗流浹背碗旅。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工镜悉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留祟辟,地道東北人侣肄。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓旧困,卻偏偏與公主長得像茫孔,于是被迫代替她去往敵國和親叮喳。 傳聞我的和親對象是個殘疾皇子缰贝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355