Qt程序啟動動畫

一、Qt有3種方式實現程序啟動動畫(介紹)

1、QSplashScreen?靜態圖片(png、jpg等格式)

2、QMovie?動態圖片(gif格式)

3、QAxWidget?視頻(swf格式)

1.QSplashScreen 靜態圖片(png、jpg等格式)

//創建啟動動畫類實例
QSplashScreen splash(QPixmap("C:/Users/10600/Pictures/imgs/p1.png")); //文件絕對路徑 也可以使用相對路徑
splash.showMessage(QStringLiteral("正在初始化..."));//消息提示
splash.show(); //顯示a.processEvents(); //保證先完成啟動畫面的繪制顯示,再執行后面的w顯示//主界面顯示
MainWindow w;
w.show();splash.finish(&w); //結束

2.QMovie 動態圖片(gif格式)

QMovie movie("C:/Users/10600/Pictures/tai.gif");
QLabel label;label.setGeometry(300, 300, 500, 500);
label.setMovie(&movie);
label.setScaledContents(true); //自動適應窗口大小
label.setWindowFlags(Qt::FramelessWindowHint); //去除邊框movie.start();
label.show();//延遲5秒
QTime t;
t.start();
while(t.elapsed() < 5000)
{
QApplication::processEvents();
}//主界面顯示
MainWindow w;
w.show();
label.close();

3.QAxWidget視頻(swf格式)

需要在.pro文件中添加 QT += axcontainer

QTextCodec *codec = QTextCodec::codecForName("GB2312"); //文本為GB2312編碼
QTextCodec::setCodecForLocale(codec); //設置本地編碼QAxWidget flash;
flash.resize(800,600); //設置該控件的初始大小
flash.setControl(QString::fromUtf8("{d27cdb6e-ae6d-11cf-96b8-444553540000}")); //設定控制器
flash.dynamicCall("LoadMovie(long,string)", 0, "C:/Users/10600/Videos/2.swf"); //文件絕對路徑 也可以使用相對路徑
flash.setWindowFlags(Qt::FramelessWindowHint); //去除邊框
flash.show();//延遲5秒
QTime t;
t.start();
while(t.elapsed() < 5000)
{
QApplication::processEvents();
}//主界面顯示
MainWindow w;
w.show();
flash.close();

二、QT 實現軟件啟動動畫與加載進度(實現)

下面是一個完整的 QT 實現方案,包含啟動動畫、主界面加載和進度條顯示功能。

功能說明

實現啟動動畫,在等待主界面出現之前加載動畫,主界面加載完成后動畫結束,顯示主界面,啟動動畫是一個圖片加從一個點到四個點的加載動畫

代碼

1. 自定義啟動畫面類 (animatedsplash.h)

#ifndef ANIMATEDSPLASH_H
#define ANIMATEDSPLASH_H#include <QSplashScreen>
#include <QTimer>
#include <QPainter>class AnimatedSplash : public QSplashScreen
{Q_OBJECT
public:explicit AnimatedSplash(const QPixmap &background, QWidget *parent = nullptr);~AnimatedSplash();void setLoadingDotsColor(const QColor &color);void setLoadingDotsRadius(int radius);void setLoadingDotsSpacing(int spacing);protected:void drawContents(QPainter *painter) override;private slots:void updateAnimation();private:QTimer *m_animationTimer;int m_dotPosition;  // 當前動畫位置 (0-3)QColor m_dotsColor;int m_dotsRadius;int m_dotsSpacing;QPixmap m_background;
};#endif // ANIMATEDSPLASH_H

2. 自定義啟動畫面實現 (animatedsplash.cpp)

#include "AnimatedSplash.h"
#include <QApplication>
#include <QPainter>AnimatedSplash::AnimatedSplash(const QPixmap &background, QWidget *parent): QSplashScreen(background),m_dotPosition(0),m_dotsColor(Qt::white),m_dotsRadius(8),m_dotsSpacing(20),m_background(background)
{// 設置動畫定時器m_animationTimer = new QTimer(this);connect(m_animationTimer, &QTimer::timeout, this, &AnimatedSplash::updateAnimation);m_animationTimer->start(300);  // 每300ms更新一次動畫// 設置窗口屬性setFixedSize(background.size());setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
}AnimatedSplash::~AnimatedSplash()
{m_animationTimer->stop();delete m_animationTimer;
}void AnimatedSplash::setLoadingDotsColor(const QColor &color)
{m_dotsColor = color;
}void AnimatedSplash::setLoadingDotsRadius(int radius)
{m_dotsRadius = radius;
}void AnimatedSplash::setLoadingDotsSpacing(int spacing)
{m_dotsSpacing = spacing;
}void AnimatedSplash::drawContents(QPainter *painter)
{// 先繪制背景圖QSplashScreen::drawContents(painter);// 計算加載點的中心Y位置(距離底部50像素)int centerY = height() - 50;int startX = width() / 2 - (m_dotsRadius * 2 + m_dotsSpacing * 1.5);// 繪制"啟動中"文字painter->setPen(m_dotsColor);  // 使用相同的顏色painter->setOpacity(1.0);      // 完全不透明QFont font = painter->font();font.setPixelSize(m_dotsRadius * 6);  // 設置合適的字體大小painter->setFont(font);// 計算文字位置(在第一個點左側留出空間)int textWidth = painter->fontMetrics().horizontalAdvance("啟動中");int textX = startX - textWidth - m_dotsSpacing;  // 在第一個點左側留出一個間距painter->drawText(textX, centerY + m_dotsRadius, "啟動中");// 繪制5個點for (int i = 0; i < 5; ++i) {// 當前點是否應該高亮(根據動畫位置)bool isActive = (i == m_dotPosition);qreal opacity = isActive ? 1.0 : 0.3;int radius = isActive ? m_dotsRadius : m_dotsRadius * 0.8;painter->setPen(Qt::NoPen);painter->setBrush(m_dotsColor);painter->setOpacity(opacity);int x = startX + i * (m_dotsRadius * 2 + m_dotsSpacing);painter->drawEllipse(QPoint(x, centerY), radius, radius);}// 重置畫筆設置painter->setOpacity(1.0);
}
void AnimatedSplash::updateAnimation()
{m_dotPosition = (m_dotPosition + 1) % 4;update();  // 觸發重繪
}

3. 主程序入口 (main.cpp)

#include "lectotype/lectotype.h"
#include "MainWindow/functionWindow.h"
#include <QApplication>
#include <QStyleFactory>
#include <QThread>
#include "CustomSplash/animatedsplash.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);// Lectotype w;// w.show();// 設置應用程序樣式//QApplication::setStyle(QStyleFactory::create("Fusion"));// 1. 創建并顯示自定義啟動畫面QPixmap splashPix("F:/DELTA/DELTA/bin/res/Functionwindow/alarm.png"); // 啟動背景圖AnimatedSplash splash(splashPix);// 自定義加載點樣式splash.setLoadingDotsColor(QColor(255, 215, 0)); // 金色splash.setLoadingDotsRadius(6);splash.setLoadingDotsSpacing(15);splash.show();a.processEvents(); // 確保界面能立即更新// 2. 在后臺創建并加載主窗口FunctionWindow *w=new FunctionWindow();// 3. 加載完成后顯示主窗口,關閉啟動畫面splash.finish(w);w->show();return a.exec();
}

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

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

相關文章

貪心算法經典問題

目錄 貪心思想 一、Dijkstra最短路問題 問題描述&#xff1a; 貪心策略&#xff1a; 二、Prim 和 Kruskal 最小生成樹問題 Prim 算法&#xff1a; Kruskal 算法&#xff1a; 三、Huffman樹問題 問題描述&#xff1a; 貪心策略&#xff1a; 四、背包問題 問題描述&a…

零知開源——STM32F4實現ILI9486顯示屏UI界面系列教程(一):電子書閱讀器功能

本教程將詳細介紹如何在零知增強板上使用3.5寸ILI9486顯示屏實現電子書閱讀器功能。我們將使用LVGL庫構建用戶界面&#xff0c;并實現翻頁、進度顯示等核心功能。 目錄 一、硬件連接 二、軟件UI組件實現 三、零知IDE配置 四、演示效果 五、常見問題解決 六、總結與擴展 一…

支持selenium的chrome driver更新到137.0.7151.119

最近chrome釋放新版本&#xff1a;137.0.7151.119 如果運行selenium自動化測試出現以下問題&#xff0c;是需要升級chromedriver才可以解決的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

架構下的最終瓶頸:數據庫如何破局?

在分布式系統和云原生架構逐漸成熟的當下&#xff0c;我們已能夠靈活擴展計算資源、水平擴展服務節點、拆分業務模塊等。然而&#xff0c;在經歷過多輪架構優化之后&#xff0c;數據庫常常成為系統的“最后瓶頸”。尤其當數據量、并發量、實時性要求劇增時&#xff0c;數據庫即…

湖北理元理律師事務所小微企業債務重組方案:司法與經營的共生邏輯

小微企業債務問題常陷入“救企業還是保老板”的困局。湖北理元理律師事務所為某汽車零部件供應商設計的“經營性債務重組”方案&#xff0c;提供了創新解題思路。 核心矛盾拆解 該企業面臨三重困境&#xff1a; 矛盾類型 具體表現 法律風險等級 擔保鏈危機 老板個人擔保牽…

FastAdmin退出登錄不提示的修改方法

修改退出登錄后的提示行為 在FastAdmin中&#xff0c;默認退出登錄后會顯示"退出成功"的提示信息并跳轉頁面。要實現不顯示提示信息直接跳轉&#xff0c;可以通過以下方式修改&#xff1a; 方法一&#xff1a;修改控制器邏輯 找到application/admin/controller/Log…

工信部發布《中國工業軟件產業發展研究報告(2025)》:PLM壟斷加劇,Ai為國產PLM軟件發展契機

在6月17日上午舉行的2025南京軟件大會開幕式上&#xff0c;工信部電子第五研究所現場發布《中國工業軟件產業發展研究報告&#xff08;2025&#xff09;》&#xff08;以下簡稱《研究報告》&#xff09;&#xff0c;并從工業軟件產業發展現狀、產業發展趨勢&#xff0c;以及我國…

Flutter JSON解析全攻略:使用json_serializable實現高效序列化

引言&#xff1a;為什么我們需要JSON序列化工具&#xff1f; 在現代移動應用開發中&#xff0c;與服務器進行數據交互是必不可少的功能。JSON&#xff08;JavaScript Object Notation&#xff09;作為一種輕量級的數據交換格式&#xff0c;因其易讀性、簡潔性和廣泛支持性&…

shelve模塊的使用

shelve模塊的使用 1. 什么是Shelve2. Shelve模塊的數據存儲與讀取3. Shelve的讀取數據4. Shelve模塊的高級操作_ Shelve的數據更新和刪除5. 刪除操作可以使用del語句&#xff1a;6. Shelve的數據查詢和處理_使用for循環來遍歷Shelve對象中的所有鍵值對&#xff1a;7. Shelve模塊…

python大學校園舊物捐贈系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

Python爬蟲實戰:研究eventlet庫相關技術

1. 引言 在當今信息爆炸的時代,網絡上的數據量呈現出指數級增長的趨勢。從海量的網絡信息中獲取有價值的數據并進行分析,對于企業決策、學術研究以及個人興趣等方面都具有重要意義。網絡爬蟲作為一種自動化獲取網頁內容的技術手段,應運而生并得到了廣泛的應用。 網絡爬蟲(…

文字識別接口-智能文本處理-文字提取技術

文字識別接口&#xff0c;顧名思義&#xff0c;就是一種將圖像文字或手寫文字轉換為可編輯文本的技術。文字識別接口&#xff0c;基于深度學習算法與自主ocr核心實現多種場景字符的高精度識別與結構化信息提取&#xff0c;現已被廣泛應用于銀行、醫療、財會、教育等多個領域。 …

Redis的持久化機制詳細解析

Redis的持久化機制詳細解析 今天我們來聊聊Redis的持久化機制。想象一下&#xff0c;你正在玩一個非常精彩的游戲&#xff0c;突然斷電了&#xff0c;如果沒有存檔功能&#xff0c;所有的進度都會丟失&#xff0c;是不是很崩潰&#xff1f; Redis作為內存數據庫&#xff0c;同…

2025年SYN-CC混合攻擊防御實戰:某金融平臺抵御800Gbps雙重風暴實錄

“你以為防住SYN Flood就能高枕無憂&#xff1f;新型SYN-CC混合鏈正在撕裂傳統防御體系&#xff01;” 一、事件現場&#xff1a;一場精準的“協議層絞殺” 2025年5月&#xff0c;某跨境支付平臺遭遇史上首次SYN-CC混合攻擊&#xff0c;峰值流量達 800Gbps&#xff0c;核心交易…

JSON 編輯器:從語法到數據處理(二)

JSON 編輯器&#xff1a;從語法編寫到結構可視化&#xff08;一&#xff09;-CSDN博客 在上一篇中&#xff0c;我們了解了 JSON 的語法和編輯器&#xff0c;解決了 “怎么寫對 JSON” 的問題。 而實際開發中&#xff0c;更關鍵的是 “怎么高效處理 JSON 數據” —— 如何從商品…

按鍵開關的結構、功能與環保安全?

工業控制的核心觸手&#xff1a;深度解析按鍵開關的結構、功能與環保安全 一、 結構基石&#xff1a;雙觸點轉換機制 按鍵開關的核心在于其精妙的觸點系統。絕大多數按鍵開關都配備有兩對獨立的觸點&#xff0c;這是實現復雜控制邏輯的基礎。每一對觸點并非隨意組合&#xff…

BigDetection:改進目標檢測器預訓練的大規模基準之論文閱讀

摘要 近年來,多個數據集和開放挑戰已被引入用于目標檢測研究。為了構建更通用且強大 的目標檢測系統,本文提出了一個新的大規模基準數據集,稱為 BigDetection。我們的目標是 整合現有數據集(LVIS、OpenImages 和 Object365)的訓練數據,并遵循精心設計的原則,構建一個更…

Linux系統移植⑨:uboot啟動流程詳解-bootz啟動Linux過程

Linux系統移植⑨&#xff1a;uboot啟動流程詳解-bootz啟動Linux過程 bootz 是 U-Boot 中用于啟動 Linux 內核的命令&#xff0c;專為處理 zImage&#xff08;壓縮內核映像&#xff09; 設計。 啟動 Linux 的完整過程&#xff1a; 1. 加載內核與相關文件 U-Boot 先將以下文件…

【R】基于R實現貝葉斯分析(一)

文章目錄 貝葉斯簡介Why R理論基礎一、三種先驗分布和對應后驗的計算1. 離散先驗2.Beta先驗&#xff08;共軛先驗&#xff09;3. 直方圖先驗 二. 后驗抽樣1. 網格點采樣法2. 其他方法 三、貝葉斯推斷1. 參數估計(1) 后驗均值(2) 后驗方差(3) 后驗區間 2. 假設檢驗3. 預測(1) 先…

論文略讀:Personality Alignment of Large Language Models

ICLR 2025 558 當前的大語言模型&#xff08;LLMs&#xff09;在對齊時&#xff0c;通常旨在反映普遍的人類價值觀與行為模式&#xff0c;但卻常常無法捕捉到個體用戶的獨特特征與偏好。 為填補這一空白&#xff0c;本文提出了**“人格對齊&#xff08;Personality Alignment&…