qt启动等待动态图

📅 2026/7/4 3:02:55
qt启动等待动态图
#ifndefSPLASHSCREEN_H#defineSPLASHSCREEN_H#includeQLabel#includeQGridLayout#includeQTimer#includeQPainter#includeQMouseEvent//启动窗口classSplashScreen:publicQWidget{Q_OBJECTpublic:explicitSplashScreen(intnLoadingType,QWidget*parentnullptr);~SplashScreen();voidsetWidget(QWidget*mainWidget);QWidget*getWidget();voidinit();voidcloseWidget();voidsetLoadText(constQStringtitle);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#includesplashscreen.hSplashScreen::SplashScreen(intnLoadingType,QWidget*parent)\:QWidget(parent),\m_pMainWidget(nullptr){m_nLoadingTypenLoadingType;//加载图形的类型范围为0-8if((m_nLoadingType0)||(m_nLoadingType8)){m_nLoadingType0;}init();}SplashScreen::~SplashScreen(){deletem_pLoadTimer;deletem_pCountTimer;}voidSplashScreen::setWidget(QWidget*mainWidget){m_pMainWidgetmainWidget;}QWidget*SplashScreen::getWidget(){returnm_pMainWidget;}voidSplashScreen::setLoadText(constQStringtitle){if(!title.isEmpty()){m_pTextLabel-setText(title);}}voidSplashScreen::setLoadCount(intcount){if(m_nCount!count){m_nCountcount;}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_pNumLabelnewQLabel(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);\nfont: 75 50pt \\346\245\267\344\275\223\;\nbackground-color: transparent;));m_pTextLabelnewQLabel(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);\nfont: 75 14pt \\346\245\267\344\275\223\;\nbackground-color: transparent;));m_pGridLayoutnewQGridLayout(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_nWidthwidth();m_nHeightheight();m_pLoadTimernewQTimer(this);connect(m_pLoadTimer,SIGNAL(timeout()),SLOT(update()));m_pLoadTimer-setInterval(5);m_pCountTimernewQTimer(this);connect(m_pCountTimer,SIGNAL(timeout()),SLOT(countTimeout()));m_pCountTimer-setInterval(1000);m_nAngle0;m_nCount5;m_pNumLabel-setText(QString::number(m_nCount));}voidSplashScreen::mousePressEvent(QMouseEvent*event){m_MousePosevent-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/LoadingQString::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_nAngle2;if(m_nAngle360)m_nAngle0;}voidSplashScreen::countTimeout(){m_nCount--;m_pNumLabel-setText(QString::number(m_nCount));if(m_nCount0){emitfinish();if(m_pLoadTimer-isActive())m_pLoadTimer-stop();if(m_pCountTimer-isActive())m_pCountTimer-stop();close();if(m_pMainWidget)m_pMainWidget-show();}}intnType0;SplashScreen*pSplashScreennewSplashScreen(nType,nullptr);pSplashScreen-setLoadCount(9);pSplashScreen-start();