qt启动等待动态图

📅 2026/7/4 3:06:34 👁️ 阅读次数 📝 编程学习
qt启动等待动态图
#ifndefSPLASHSCREEN_H#defineSPLASHSCREEN_H#include<QLabel>#include<QGridLayout>#include<QTimer>#include<QPainter>#include<QMouseEvent>//启动窗口classSplashScreen:publicQWidget{Q_OBJECTpublic:explicitSplashScreen(intnLoadingType,QWidget*parent=nullptr);~SplashScreen();voidsetWidget(QWidget*mainWidget);QWidget*getWidget();voidinit();voidcloseWidget();voidsetLoadText(constQString&title);voidsetLoadCount(intcount);voidstart();protected:virtualvoidmousePressEvent(QMouseEvent*event)override;virtualvoidmouseMoveEvent(QMouseEvent*event)override;virtualvoidpaintEvent(QPaintEvent*event)override;signals:voidfinish();publicslots:voidcountTimeout();private:QGridLayout*m_pGridLayout;QLabel*m_pNumLabel;//倒计时计数标签QLabel*m_pTextLabel;//文字标签QWidget*m_pMainWidget;//保存主窗口//SplashScreen显示完毕后,就自动显示m_pMainWidgetQPoint m_MousePos;//保存鼠标位置QTimer*m_pLoadTimer;QTimer*m_pCountTimer;intm_nWidth;//窗口宽度intm_nHeight;//窗口高度intm_nAngle;//旋转角度intm_nCount;//倒计时描述intm_nLoadingType;//加载样式};};#endif// SPLASHSCREEN_H
#include"splashscreen.h"SplashScreen::SplashScreen(intnLoadingType,QWidget*parent)\:QWidget(parent),\m_pMainWidget(nullptr){m_nLoadingType=nLoadingType;//加载图形的类型范围为0-8if((m_nLoadingType<0)||(m_nLoadingType>8)){m_nLoadingType=0;}init();}SplashScreen::~SplashScreen(){deletem_pLoadTimer;deletem_pCountTimer;}voidSplashScreen::setWidget(QWidget*mainWidget){m_pMainWidget=mainWidget;}QWidget*SplashScreen::getWidget(){returnm_pMainWidget;}voidSplashScreen::setLoadText(constQString&title){if(!title.isEmpty()){m_pTextLabel->setText(title);}}voidSplashScreen::setLoadCount(intcount){if(m_nCount!=count){m_nCount=count;}m_pNumLabel->setText(QString::number(m_nCount));}voidSplashScreen::start(){// m_pCountTimer->start();m_pLoadTimer->start();show();}voidSplashScreen::init(){//setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//setAttribute(Qt::WA_TranslucentBackground);resize(300,300);//setAttribute(Qt::WA_DeleteOnClose);m_pNumLabel=newQLabel(this);QSizePolicysizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding);sizePolicy.setHorizontalStretch(0);sizePolicy.setVerticalStretch(0);sizePolicy.setHeightForWidth(m_pNumLabel->sizePolicy().hasHeightForWidth());m_pNumLabel->setSizePolicy(sizePolicy);m_pNumLabel->setAlignment(Qt::AlignCenter);m_pNumLabel->setStyleSheet(QString::fromUtf8("color: rgb(55, 55, 55);\n""font: 75 50pt \"\346\245\267\344\275\223\";\n""background-color: transparent;"));m_pTextLabel=newQLabel(this);m_pTextLabel->setVisible(false);m_pTextLabel->setText(QString("Loading"));m_pTextLabel->setMinimumSize(0,40);m_pTextLabel->setMaximumHeight(40);m_pTextLabel->setAlignment(Qt::AlignHCenter|Qt::AlignTop);m_pTextLabel->setStyleSheet(QString::fromUtf8("color: rgb(55, 55, 55);\n""font: 75 14pt \"\346\245\267\344\275\223\";\n""background-color: transparent;"));m_pGridLayout=newQGridLayout(this);m_pGridLayout->setSpacing(0);m_pGridLayout->setContentsMargins(11,11,11,11);m_pGridLayout->setContentsMargins(70,70,70,70);m_pGridLayout->addWidget(m_pNumLabel,1,0,1,1);m_pGridLayout->addWidget(m_pTextLabel,2,0,1,1);setLayout(m_pGridLayout);setStyleSheet("QLabel{ color: rgb(55, 55, 55);""font: 75 50pt \"\346\245\267\344\275\223\";""background-color: transparent;}");m_nWidth=width();m_nHeight=height();m_pLoadTimer=newQTimer(this);connect(m_pLoadTimer,SIGNAL(timeout()),SLOT(update()));m_pLoadTimer->setInterval(5);m_pCountTimer=newQTimer(this);connect(m_pCountTimer,SIGNAL(timeout()),SLOT(countTimeout()));m_pCountTimer->setInterval(1000);m_nAngle=0;m_nCount=5;m_pNumLabel->setText(QString::number(m_nCount));}voidSplashScreen::mousePressEvent(QMouseEvent*event){m_MousePos=event->globalPos()-pos();}voidSplashScreen::mouseMoveEvent(QMouseEvent*event){move(event->globalPos()-m_MousePos);}voidSplashScreen::paintEvent(QPaintEvent*event){Q_UNUSED(event);QPainterpainter(this);painter.setRenderHint(QPainter::Antialiasing);QPixmap pixmap;QString strPath=":/Images/Loading/Loading"+QString::number(m_nLoadingType)+".png";pixmap.load(strPath);//平移到中间painter.translate(m_nWidth/2,m_nHeight/2);//旋转角度painter.rotate(m_nAngle);//图片的旋转轨迹是一个圆圈,必须把图片圆心移到这个轨迹圆,才能拼凑出画面painter.translate(-m_nWidth/2,-m_nHeight/2);//画图片//图片的宽高和窗口宽高是一样的painter.drawPixmap(0,0,m_nWidth,m_nHeight,pixmap);//角度每次转2度m_nAngle+=2;if(m_nAngle>=360)m_nAngle=0;}voidSplashScreen::countTimeout(){m_nCount--;m_pNumLabel->setText(QString::number(m_nCount));if(m_nCount<=0){emitfinish();if(m_pLoadTimer->isActive())m_pLoadTimer->stop();if(m_pCountTimer->isActive())m_pCountTimer->stop();close();if(m_pMainWidget)m_pMainWidget->show();}}
intnType=0;SplashScreen*pSplashScreen=newSplashScreen(nType,nullptr);pSplashScreen->setLoadCount(9);pSplashScreen->start();