Qt 簡約美觀的加載動畫 文本風格 第八季

今天和大家分享一個文本風格的加載動畫, 有兩類,其中一個可以設置文本內容和文本顏色,演示了兩份. 共三個動畫, 效果如下:
在這里插入圖片描述

一共三個文件,可以直接編譯 , 如果對您有所幫助的話 , 不要忘了點贊呢.

//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QGridLayout>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.setWindowTitle("加載動畫 第8季");QGridLayout * mainLayout = new QGridLayout;auto* anim1= new TextInBouncingBox("正在加載");mainLayout->addWidget(anim1,0,0);auto* anim2 = new TextInBouncingBox("正在加載中");anim2->setBoxColor("slateblue");anim2->setTextColor("white");mainLayout->addWidget(anim2,0,1);auto* anim3 = new ExpandingScroll;mainLayout->addWidget(anim3,0,2);w.setLayout(mainLayout);w.show();anim1->start();anim2->start();anim3->start();return a.exec();
}
//LoadingAnimWidget.h
#ifndef LOADINGANIMWIDGET_H
#define LOADINGANIMWIDGET_H
#include <QPropertyAnimation>
#include <QWidget>
class LoadingAnimBase:public QWidget
{Q_OBJECTQ_PROPERTY(qreal angle READ angle WRITE setAngle)
public:LoadingAnimBase(QWidget* parent=nullptr);virtual ~LoadingAnimBase();qreal angle()const;void setAngle(qreal an);
public slots:virtual void exec();virtual void start();virtual void stop();
protected:QPropertyAnimation mAnim;qreal mAngle;
};
class TextInBouncingBox:public LoadingAnimBase{//顯示裝在上下跳動的盒子里的字符
public:TextInBouncingBox(const QString & str,QWidget* parent = nullptr);void setTextColor(const QColor& color);void setBoxColor(const QColor& color);
protected:void paintEvent(QPaintEvent*);
private:QString mText;QColor mTextColor;QColor mBoxColor;
};
class ExpandingScroll:public LoadingAnimBase{//一個圓環轉動兩圈之后像卷軸一樣展示"正在加載"
public:ExpandingScroll(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
#endif
//LoadingAnimWidget.cpp
#include "LoadingAnimWidget.h"
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QtMath>
#include <QRandomGenerator>
LoadingAnimBase::LoadingAnimBase(QWidget* parent):QWidget(parent){mAnim.setPropertyName("angle");mAnim.setTargetObject(this);mAnim.setDuration(2000);mAnim.setLoopCount(-1);//run forevermAnim.setEasingCurve(QEasingCurve::Linear);setFixedSize(200,200);mAngle = 0;
}
LoadingAnimBase::~LoadingAnimBase(){}
void LoadingAnimBase::exec(){if(mAnim.state() == QAbstractAnimation::Stopped){start();}else{stop();}
}
void LoadingAnimBase::start(){mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}
void LoadingAnimBase::stop(){mAnim.stop();
}
qreal LoadingAnimBase::angle()const{ return mAngle;}
void LoadingAnimBase::setAngle(qreal an){mAngle = an;update();
}
TextInBouncingBox::TextInBouncingBox(const QString& str,QWidget* parent ):LoadingAnimBase (parent),mText(str),mBoxColor("darkslategray"),mTextColor("yellow"){setFont(QFont("Microsoft YaHei",16,2));
}
void TextInBouncingBox::setTextColor(const QColor& color){if(mTextColor != color){mTextColor = color;update();}
}
void TextInBouncingBox::setBoxColor(const QColor& color){if(mBoxColor != color){mBoxColor = color;update();}
}void TextInBouncingBox::paintEvent(QPaintEvent*){const int len = mText.size();if(len <= 0) return;QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QFontMetrics fm(font());const int txtH = fm.height();const int rectH = txtH + 4;const int rectW = fm.horizontalAdvance("w")+4;const qreal x = width();const qreal y = height();painter.translate(0.1*x,0.6*y);painter.setBrush(QBrush(mBoxColor));const qreal amplitude = rectH*0.3;const qreal offset = M_PI / len / 2;for(int i = 0;i < len;++i){QRectF rct( i*rectW,-rectH - amplitude*qSin(-2*M_PI / 360 * mAngle + offset*i) ,rectW,rectH);painter.setPen(Qt::NoPen);painter.drawRect(rct);  //畫一個小盒子painter.setPen(mTextColor);painter.drawText(rct,Qt::AlignCenter,QString(mText[i])); //畫一個字符}
}ExpandingScroll::ExpandingScroll(QWidget* parent):LoadingAnimBase (parent){setFont(QFont("Microsoft YaHei",16,2));mAnim.setDuration(4000);
}void ExpandingScroll::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);qreal x = width();qreal y = height();painter.translate(x/2,y/2);painter.setBrush(Qt::NoBrush);QPen pen("black");static const qreal penWidth = 4;pen.setWidthF(penWidth);painter.setPen(pen);x -= 4;y -= 4;const auto ang = mAngle;const int arr[9] = {20,30,60,90,150,180,210,275,345};//9個時間節點,分割下面10個分支if(ang < arr[0]){//中間的豎線轉變為半圓弧線const qreal h = 0.25*x;painter.drawLine(0,h/2 - ang/arr[0] * h,0,-h/2);painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),180*16,-180*16*ang/arr[0]);}else if(ang < arr[1]){//半圓弧線轉變為四分之一圓弧和右側的小豎線const qreal h = 0.25*x;const qreal ratio = (ang-arr[0])/(arr[1] - arr[0]);qreal start = 180 - 90*ratio;painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),start*16,-start*16);painter.drawLine(x/2,-h/2,x/2,-h/2+h/2*ratio);}else if(ang < arr[2]){//剩下的上方的四分之一圓弧轉為大的下方的八分之一圓弧const qreal h = 0.25*x;const qreal ratio = (ang - arr[1]) / (arr[2] - arr[1]);qreal start = 90 - 90 * ratio;painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),start*16,-start*16);painter.drawLine(x/2,-h/2,x/2,0);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-45*16*ratio);}else if(ang < arr[3]){//小豎線轉為下方的大的八分之一圓弧const qreal h = x/8;qreal ratio = (ang-arr[2]) / (arr[3] - arr[2]);painter.drawLine(x/2,-h*(1-ratio),x/2,0);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-(45+45*ratio)*16);}else if(ang < arr[4]){//大圓弧轉兩圈qreal ratio = (ang - arr[3]) / (arr[4] - arr[3]);painter.rotate(720*ratio);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-90*16);}else if(ang < arr[5]){//大圓弧轉為豎線qreal ratio = (ang-arr[4]) / (arr[5] - arr[4]);painter.drawArc(QRectF(-x/2,-y/2,x,y),-90*ratio*16,-90*(1-ratio)*16);painter.drawLine(0,y/2,0,y/2 - 0.625*ratio*y);}else if(ang < arr[6]){//豎線縮小一下qreal ratio = (ang - arr[5]) / (arr[6] - arr[5]);painter.drawLine(0,y/2 - 0.375*y*ratio,0,-0.125*y);}else if(ang < arr[7]){//展開卷軸qreal ratio = (ang - arr[6]) / (arr[7] - arr[6]);QPainterPath pp;pp.addRect(QRectF(-0.375*x*ratio,-0.125*y,0.75*x*ratio,y/4).adjusted(penWidth/-2,penWidth/-2,penWidth/2,penWidth/2));painter.setClipPath(pp);const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加載");}else if(ang < arr[8]){//展示一小段時間const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加載");}else{//收起卷軸qreal ratio = (ang - arr[8])/(360 - arr[8]);QPainterPath pp;pp.addRect(QRectF(-0.375*x* (1-ratio),-0.125*y,0.75*x*(1-ratio),y/4).adjusted(penWidth/-2,penWidth/-2,penWidth/2,penWidth/2));painter.setClipPath(pp);const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加載");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716815.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716815.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716815.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL:開始深入其數據(一)DML

在上一章初識MySQL了解了如何定義數據庫和數據表&#xff08;DDL&#xff09;&#xff0c;接下來我們開始開始深入其數據,對其數據進行訪問&#xff08;DAL&#xff09;、查詢DQL&#xff08;&#xff09;和操作(DML)等。 通過DML語句操作管理數據庫數據 DML (數據操作語言) …

一文搞定 FastAPI 路徑參數

路徑參數定義 路徑操作裝飾器中對應的值就是路徑參數,比如: from fastapi import FastAPI app = FastAPI()@app.get("/hello/{name}") def say_hello(name: str):return {

突破編程_C++_STL教程( list 的基礎知識)

1 std::list 概述 std::list 是 C 標準庫中的一個雙向鏈表容器。它支持在容器的任何位置進行常數時間的插入和刪除操作&#xff0c;但不支持快速隨機訪問。與 std::vector 或 std::deque 這樣的連續存儲容器相比&#xff0c;std::list 在插入和刪除元素時不需要移動其他元素&a…

計算機網絡之傳輸層 + 應用層

.1 UDP與TCP IP中的檢驗和只檢驗IP數據報的首部, 但UDP的檢驗和檢驗 偽首部 首部 數據TCP的交互單位是數據塊, 但仍說TCP是面向字節流的, 因為TCP僅把應用層傳下來的數據看成無結構的字節流, 根據當時的網絡環境組裝成大小不一的報文段.10秒內有1秒用于發送端發送數據, 信道…

【Python】進階學習:pandas--groupby()用法詳解

&#x1f4ca;【Python】進階學習&#xff1a;pandas–groupby()用法詳解 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程&#x1f448;…

Python算法100例-3.5 親密數

1.問題描述2.問題分析3.算法設計4.確定程序框架5.完整的程序6.問題拓展 1&#xff0e;問題描述 如果整數A的全部因子&#xff08;包括1&#xff0c;不包括A本身&#xff09;之和等于B&#xff0c;且整數B的全部因子&#xff08;包括1&#xff0c;不包括B本身&#xff09;之和…

中國電子學會2020年6月份青少年軟件編程Sc ratch圖形化等級考試試卷四級真題。

第 1 題 【 單選題 】 1.執行下面程序&#xff0c;輸入4和7后&#xff0c;角色說出的內容是&#xff1f; A&#xff1a;4&#xff0c;7 B&#xff1a;7&#xff0c;7 C&#xff1a;7&#xff0c;4 D&#xff1a;4&#xff0c;4 2.執行下面程序&#xff0c;輸出是&#xff…

Oracle自帶的網絡工具(計算傳輸redo需要的帶寬,使用STATSPACK,計算redo壓縮率,db_ultra_safe)

--根據primary database redo產生的速率,計算傳輸redo需要的帶寬. 除去tcp/ip網絡其余30%的開銷,計算需要的帶寬公式: 需求帶寬((每秒產生redo的速率峰值/0.75)*8)/1,000,000帶寬(Mbps) --可以通過去多次業務高峰期的Statspack/AWR獲取每秒產生redo的速率峰值,也可以通過查詢視…

post請求體內容無法重復獲取

post請求體內容無法重復獲取 為什么會無法重復讀取呢&#xff1f; 以tomcat為例&#xff0c;在進行請求體讀取時實際底層調用的是org.apache.catalina.connector.Request的getInputStream()方法&#xff0c;而該方法返回的是CoyoteInputStream輸入流 public ServletInputStream…

CVE-2016-5195 復現記錄

文章目錄 poc前置知識頁表與缺頁異常/proc/self/mem的寫入流程madvise 漏洞點修復 Dirty COW臟牛漏洞是一個非常有名的Linux競爭條件漏洞&#xff0c;雖然早在2016年就已經被修復&#xff0c;但它依然影響著眾多古老版本的Linux發行版&#xff0c;如果需要了解Linux的COW&#…

Redis7 實現持久化的三種方式

1、概述 1.1、Redis持久化的重要性 數據恢復&#xff1a;Redis是一個內存數據庫&#xff0c;如果系統或服務宕機&#xff0c;內存中的數據將會丟失。Redis的持久化機制可以把數據保存到磁盤上&#xff0c;以便在系統重啟后恢復數據。這是Redis持久化最基本也是最重要的功能。…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ? COND CODE&#xff0c;就是反映JCL中STEP運行狀態的參數&#xff0c;JCL正常終了的COND CODE 是0000&#xff0c;另外筆者在執行某些工具JCL時候&#xff0c;比方說簡單一個COMPARE吧&#xff0c;可能會出現0012、0004或者0016&#xff0c;0001&#xf…

JSON與Object等的相互轉換

JSON與Object的轉換 // 將 Object 對象轉換為 String 類型 String jsonString = JSON.toJSONString(body);// 將 String 或 byte[] 轉換為 JSONObject 類型 JSONObject jsonObject = JSONObject.parseObject(jsonString); // 根據鍵key獲取 JSONObject 中的某一個鍵值對的值 S…

數據結構:棧和隊列的實現附上源代碼(C語言版)

目錄 前言 1.棧 1.1 棧的概念及結構 1.2 棧的底層數據結構選擇 1.2 數據結構設計代碼&#xff08;棧的實現&#xff09; 1.3 接口函數實現代碼 &#xff08;1&#xff09;初始化棧 &#xff08;2&#xff09;銷毀棧 &#xff08;3&#xff09;壓棧 &#xff08;4&…

金三銀四求職攻略:如何在面試中脫穎而出

隨著春天的腳步漸近&#xff0c;對于眾多程序員來說&#xff0c;一年中最繁忙、最重要的時期也隨之而來。金三銀四&#xff0c;即三月和四月&#xff0c;被廣大程序員視為求職的黃金時段。在這段時間里&#xff0c;各大公司紛紛開放招聘&#xff0c;求職者們則通過一場又一場的…

初階數據結構之---棧和隊列(C語言)

引言 在順序表和鏈表那篇博客中提到過&#xff0c;棧和隊列也屬于線性表 線性表&#xff1a; 線性表&#xff08;linear list&#xff09;是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構。線性表在邏輯上是線性結構&#xff0c;也就是說是連…

xxl-job--02--可視化界面各功能詳細介紹

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 可視化界面1 新增執行器2.新增任務**執行器**&#xff1a;**任務描述**&#xff1a;**路由策略**&#xff1a;**Cron**&#xff1a;cron表達式**運行模式**JobHandl…

01.18 校招 實習 內推 面經

綠*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;內推/實習/校招匯總表格 1、校招 | 中國航天科工四院四部2024春季校園招聘 校招 | 中國航天科工四院四部2024春季校園招聘 2、阿里集團24屆秋招「空缺崗位」大盤點 校招 | 阿里集團24屆校招補錄大盤點&#xff0…

全量知識系統問題及SmartChat給出的答復 之15 幣圈生態鏈

Q40. 今天聊聊關于幣圈和幣圈生態方面&#xff0c;尤其是在建立和保護各種幣圈生態鏈的問題。 主要包括各種主體、 各種權益 和 各種幣及其幣圈的 分類&#xff0c;包括 概念、關系和 鏈接和斷鏈的判斷根據等等&#xff0c; 是否有一個比較清晰的體系結構呢&#xff1f; 因為現…

java Springboot vue 健身房系統,簡單練手項目

該項目主要分為管理員和會員模塊 管理員具有&#xff1a;會員管理&#xff0c;器材管理,員工管理&#xff0c;健身課程管理 會員模塊&#xff0c;可以在線報名健身課程&#xff0c;查看自己課程 采用VUE前端開發和springboot后端開發&#xff0c;極簡代碼編寫&#xff0c;沒…