通过继承QSplashScreen类,得到CMySplashScreen类,然后在CMySplashScreen中定义QProgressBar变量,该变量以CMySplashScreen为父类,这样就实现了带进度条的启动界面。

进度条加入后,需要控制进度条的值,为了让进度条看起来更逼真,可以通过生成随机数的方式,把随机数当做进度条的值。此时,生成的随机数必须是从小到大排列的,要不然进度条就不会从开端一步步走到终点,而是会出现走到一半后又回到开端等反常现象。如何生成随机数可参考http://blog.csdn.net/caoshangpa/article/details/51036267

CMySplashScreen类的实现如下所示。

  1. #ifndef CMYSPLASHSCREEN_H
  2. #define CMYSPLASHSCREEN_H
  3. #include <QSplashScreen>
  4. #include <QPixmap>
  5. #include <QProgressBar>
  6. #include <QList>
  7. #include <QtGlobal>
  8. class CMySplashScreen: public QSplashScreen
  9. {
  10. Q_OBJECT
  11. public:
  12. CMySplashScreen(QPixmap& pixmap,int time);
  13. ~CMySplashScreen();
  14. private:
  15. //进度条
  16. QProgressBar *ProgressBar;
  17. //随机数列表
  18. QList<int> numbersList;
  19. //启动界面停留的时间
  20. int elapseTime;
  21. private:
  22. void setProgress();
  23. void generateAscendRandomNumber();
  24. private slots:
  25. void slotUpdateProgress();
  26. };
  27. #endif // CMYSPLASHSCREEN_H
  1. #include "cmysplashscreen.h"
  2. #include <QTime>
  3. #include <QTimer>
  4. CMySplashScreen::CMySplashScreen(QPixmap& pixmap,int time) :
  5. QSplashScreen(pixmap),
  6. elapseTime(time)
  7. {
  8. ProgressBar = new QProgressBar(this);
  9. //设置进度条的位置
  10. ProgressBar->setGeometry(0,pixmap.height()-50,pixmap.width(),30);
  11. //设置进度条的样式
  12. ProgressBar->setStyleSheet("QProgressBar {color:black;font:30px;text-align:center; }QProgressBar::chunk {background-color: rgb(202, 165, 14);}");
  13. //设置进度条的样式
  14. ProgressBar->setRange(0, 100);
  15. //设置进度条的当前进度
  16. ProgressBar->setValue(0);
  17. generateAscendRandomNumber();
  18. setProgress();
  19. }
  20. CMySplashScreen::~CMySplashScreen()
  21. {
  22. }
  23. void CMySplashScreen::setProgress()
  24. {
  25. int tempTime=elapseTime/100;
  26. for(int i=0;i<100;i++)
  27. {
  28. QTimer::singleShot(i*tempTime, this, SLOT(slotUpdateProgress()));
  29. }
  30. QTimer::singleShot(elapseTime, this, SLOT(close()));
  31. }
  32. void CMySplashScreen::slotUpdateProgress()
  33. {
  34. static int num=0;
  35. ProgressBar->setValue(numbersList[num]);
  36. num++;
  37. }
  38. void CMySplashScreen::generateAscendRandomNumber()
  39. {
  40. int i;
  41. qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
  42. //生成100个大小在[0,100]之间的随机数
  43. for(i=0;i<100;i++)
  44. {
  45. numbersList.append(qrand()%101);
  46. }
  47. //递增排序
  48. qSort(numbersList.begin(),numbersList.end());
  49. }

启动界面效果如下所示。

Qt带进度条的启动界面(继承QSplashScreen,然后使用定时器)-LMLPHP
源码链接:见http://blog.csdn.net/caoshangpa/article/details/51037427的评论

04-21 17:22