1. 程式人生 > >Qt 旋轉動畫(純程式碼)

Qt 旋轉動畫(純程式碼)

簡述

初嘗QT不甚歡喜,CSDN上有非常多的朋友在為QT做出貢獻,我也願意以主觀角度來分享QT,讓QT變得更好。

該原始碼系作者個人撰寫,使用時請尊重作者,不要隨意篡改關於作者的資訊。

獲取方式

為了讓你我都能得到提升,請您在評論區留下對我的建議,並附上您可愛的郵箱,我將給您送上原始碼。

效果展示


原始碼

#ifndef CUSTOMPROGRESSINDICATOR_H
#define CUSTOMPROGRESSINDICATOR_H

#include <QWidget>
#include <QColor>
/*
* 菊花轉 進度類,基於程式碼無需圖片資源
* 作者:陳魯勇
* 郵箱:
[email protected]
* 建立時間:2017年2月10日16:26:48 * QT版本:5.0.2 * CSDN:http://blog.csdn.net/csnd_ayo * ************************************** * 說明: * 使用前請確保在QT.pro中加入 C++11 的支援 * * 示例程式碼: pIndicator = new CustomProgressIndicator(this); pIndicator->setColor(Qt::red); pIndicator->startAnimation(); */ class CustomProgressIndicator : public QWidget { Q_OBJECT Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay) Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped) Q_PROPERTY(QColor color READ color WRITE setColor) public: CustomProgressIndicator(QWidget* parent = 0); int animationDelay() const { return delay_; } /* 動畫是否正在進行中 */ bool isAnimated () const; /* 動畫完畢後,是否隱藏菊花轉 */ bool isDisplayedWhenStopped() const; /* 當前菊花轉的顏色 */ const QColor & color() const { return color_; } /* 虛擬函式:當前大小 */ virtual QSize sizeHint() const; void setBackground(const QString& _icon) { currentPix_ = QPixmap(_icon); } signals: void Finished(void); public slots: /* 開始動畫 */ void startAnimation(); /* 停止動畫 */ void stopAnimation(); /* 設定菊花轉的轉速 */ void setAnimationDelay(int delay); /* 動畫完畢後,是否隱藏菊花轉 */ void setDisplayedWhenStopped(bool state); /* 設定菊花轉顏色 */ void setColor(const QColor & color); /* * 進度 * 引數 _progress:當前進度 0 < _progress < 100 */ void onProgress(short _progress) { progress_ = _progress; } protected: /* 系統基類函式 */ virtual void timerEvent(QTimerEvent * event); virtual void paintEvent(QPaintEvent * event); private: /* 角度 */ unsigned int angle_; /* 定時器ID */ int timerId_; /* 轉速 */ int delay_; /* 是否隱藏 */ bool displayedWhenStopped_; /* 菊花轉顏色 */ QColor color_; /* 進度 */ short progress_; /* 背景圖 */ QPixmap currentPix_; }; #endif // CUSTOMPROGRESSINDICATOR_H


#include "customprogressindicator.h"
#include <QPainter>

CustomProgressIndicator::CustomProgressIndicator(QWidget* parent)
    : QWidget(parent),
      angle_(0),
      timerId_(-1),
      delay_(20),
      displayedWhenStopped_(false),
      color_(Qt::green) {
    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
    setFocusPolicy(Qt::NoFocus);
}

bool CustomProgressIndicator::isAnimated () const {
    return (timerId_ != -1);
}

void CustomProgressIndicator::setDisplayedWhenStopped(bool state) {
    displayedWhenStopped_ = state;

    update();
}

bool CustomProgressIndicator::isDisplayedWhenStopped() const {
    return displayedWhenStopped_;
}

void CustomProgressIndicator::startAnimation() {
    angle_ = 0;

    if (timerId_ == -1) {
       timerId_ = startTimer(delay_);
    }
}

void CustomProgressIndicator::stopAnimation() {
    if (timerId_ != -1) {
        killTimer(timerId_);
    }

    timerId_ = -1;

    update();
}

void CustomProgressIndicator::setAnimationDelay(int delay) {
    if (timerId_ != -1){
        killTimer(timerId_);
    }

    delay_ = delay;

    if (timerId_ != -1){
        timerId_ = startTimer(delay_);
    }
}

void CustomProgressIndicator::setColor(const QColor & color) {
    color_ = color;

    update();
}

QSize CustomProgressIndicator::sizeHint() const {
    return QSize(25,25);
}


void CustomProgressIndicator::timerEvent(QTimerEvent * /*event*/) {
    angle_ = (angle_+30)%360;

    update();
}

void CustomProgressIndicator::paintEvent(QPaintEvent * /*event*/) {
    QPainter p(this);
    p.setRenderHint(QPainter::Antialiasing);
    if (!displayedWhenStopped_ && !isAnimated()) {
        p.drawPixmap(rect(),currentPix_);
        return;
    }

    int width = qMin(this->width(), this->height());


    int outerRadius = (width-1) >> 1;
    int innerRadius = ((width-1) >> 1)*0.38;

    int capsuleHeight = outerRadius - innerRadius;
    int capsuleWidth  = (width > 32 ) ? capsuleHeight *.23 : capsuleHeight *.35;
    int capsuleRadius = capsuleWidth >> 1;

    /* 撰寫進度 */
    if (progress_ > 0 && progress_ < 100) {
        p.setPen(color_);
        p.drawText(rect(), Qt::AlignCenter, QString("%1%").arg(progress_));
    }
    else if (progress_ == 100) {
        stopAnimation();
    }

    for (int i=0; i<12; ++i) {
        QColor color = color_;
        color.setAlphaF(1.0f - (i/12.0f));
        p.setPen(Qt::NoPen);
        p.setBrush(color);
        p.save();
        p.translate(rect().center());
        p.rotate(angle_ - i*30.0f);
        p.drawRoundedRect(((-capsuleWidth) >> 1), -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius);
        p.restore();
    }
}

相關推薦

Qt 旋轉動畫程式碼

簡述 初嘗QT不甚歡喜,CSDN上有非常多的朋友在為QT做出貢獻,我也願意以主觀角度來分享QT,讓QT變得更好。 該原始碼系作者個人撰寫,使用時請尊重作者,不要隨意篡改關於作者的資訊。 獲取方式 為了讓你我都能得到提升,請您在評論區留下對我的建議,並附上您可愛的郵箱,

Qt開場動畫gif效果的實現

    Qt自己提供了一個開場動畫的類QSplashScreen,可以實現簡單的圖片開場的效果,但是是靜態的圖片。 Qt播放gif格式圖片是利用的QMovie實現的。因此利用QMoviee和QTimer,每隔一段時間將QSplashScreen重繪一次,來實現gi

實現數字手寫圖片識別程式碼

假設環境都OK import scipy.special class NeuralNetWork: def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate): #初始化網路

每天一個數據結構----佇列的順序儲存結構實現程式碼

// //  main.c //  Queue 迴圈佇列 // // //  Created by Jacobs.Guo on 2018/5/7. //  Copyright © 2018年 yage guo. All rights reser

每天一個數據結構----棧的鏈式儲存結構實現程式碼

// //  main.c //  StackList2 棧的鏈式儲存結構 // //  Created by Jacobs.Guo on 2018/4/23. //  Copyright © 2018年 yage guo. All rights

漢諾塔C語言實現程式碼

(本篇只為記錄程式碼,不加註解)a、b、c三座塔,將n個從小到大(自上而下)的圓盤從a移動到c,移動期間小圓盤必須在大圓盤上面,問移動步驟。#include<stdio.h> int main() { void hanoi(int n,char one

Qt佈局管理: 分割視窗QSplitter類講解程式碼實現分割視窗

一個QSplitter是一個可以包含其他控制元件的控制元件,這些控制元件被一個分隔條隔開,託拽這個分隔條,可以改變splitter的子控制元件的大小。 QSplitter控制元件經常做為佈局管理器使用

Qt佈局管理: 停靠視窗QDockWidget類程式碼實現

(注:以下解釋是我自己的翻譯,由於英文水平有限,望海涵) 詳細描述: QDockWidget類提供了一個窗體部件,其可以停靠在QMainWindow,或其本身作為一個在桌面上的頂級視窗(也就是父窗體

Silverlight & Blend動畫設計系列二:旋轉動畫RotateTransform

target width duration pac 操作 縮放 () rop pri Silverlight的基礎動畫包括偏移、旋轉、縮放、傾斜和翻轉動畫,這些基礎動畫毫無疑問是在Silverlight中使用得最多的動畫效果,其使用也是非常簡單的。相信看過上一篇《偏移動畫(

C# GDI繪製儀表盤程式碼實現

純程式碼實現GDI繪製儀表盤,效果在程式碼下面。public partial class HalfDashboardUc : UserControl { /// <summary> /// 儀表盤背景圖片 /// </summar

UICollectionView程式碼方式實現帶上下拉重新整理的瀑布流式

瀑布流(WaterFlow)是專案開發過程中的常見佈局,有關於瀑布流(WaterFlow)的實現方式:在UICollectionView未出現之前,瀑布流的實現多半是採用UIScrollView或是UITableView。對於我們這種用慣了表檢視的人來說,UIC

Qt動畫 QWidget

引言 動畫很讓人煩惱,在Qt中,已經給出了很多簡單的動畫,例如 QPropertyAnimation 類實現的動畫,但是還不夠智慧,不是我想要的,相信你也有同感,今天我們就來實現自定義動畫類來方便我們日後的開發。 簡介 作業系統:windo

滑鼠懸停旋轉的圖示按鈕特效CSS

效果圖如下: CSS如下: <style type="text/css"> @font-face { font-family: 'Material Icons'; font-style: normal; font-weight: 400; s

Shader toy 順手寫兩個Gyro程式碼寫3D

Shader toy (A new world) 1.一個多月了,突然忘記CSDN的密碼了,因為每次輸密碼的時候都要計算一遍,於是沒有計算出來… 2.回頭發現都過了半年了,都快捏了一把汗,這百度何時不那麼踉踉蹌蹌,搜尋服務一直那麼差,百度網速又不給力了。

c/c++常用程式碼之四爆炸輸出,jason乾貨

常用程式碼之四:建立jason,jason轉換為字串,字串轉換回jason,c#反序列化jason字串的幾個程式碼片段 建立j

Android 屬性動畫Property Animation 全然解析

顏色 valid 全部 加速度 ext target ng- 點擊 save 轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/380674751、概述Android提供了幾種動畫類型:View Anima

數字鍵盤js

outb htm -a 字符 cit style elements nim 實現 實現的要求: 第一位不能是0 不能同時出現兩個"." 最後一位不能是"." 只能輸入n位小數 註意:在ios中input會出現光標,可以加上

單頁面跳轉添加返回和跳轉動畫仿app 只對單頁面和跳轉有用,我用的是angualr,有不會的可以私信問我。

hist page func margin consola color -s tar pla p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #596972 } p.p2 { mar

【UVA】1594 Ducci Sequence模擬

i++ mar freopen esp abs mat ret code == 題目 題目 ? ? 分析 真的快瘋了,中午交了一題WA了好久,最後發現最後一個數據不能加\n,於是這次學乖了,最後一組不輸出\n,於是WA了好幾發,最後從Udebug發現最後一組是要輸出的!!

Qt學習總結C魚之信號與槽01

Qt 學習 總結 C魚 自動關聯 第一種自然是手動關聯了,只要調用connect函數就能實現自動關聯。這裏重點講第二種,自動關聯:為了實現槽函數自動進行關聯,對於Qt窗口部件已經提供的信號,可按照以下規範命名:void on_&lt;窗口部件名稱&gt;_&lt;信號名