zoukankan      html  css  js  c++  java
  • Qt中实现启动画面(延时过程中要加上app.processEvents())

     纵所周之,当一个程序的启动比较耗时的时候,为了不让用户枯燥的等待或者是误以为程序运行异常了,所以我们都会在启动比较耗时的程序中加上启动界面

    ,例如office软件等等。

             在Qt中实现启动界面,主要就是使用QSplashScreen类。该类比较简单,这里就不对类本身做过多说明了,主要是以一个例子来说明他的使用方法。

    1、首先,我们的实现如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <QApplication>  
    2. #include <QSplashScreen>  
    3. #include <QPixmap>  
    4. #include <mainwindow.h>  
    5. #include <QDebug>  
    6.   
    7. int main(int argc, char *argv[])  
    8. {  
    9.     QApplication app(argc, argv);  
    10.   
    11.     QPixmap pixmap("screen.png");  
    12.     QSplashScreen screen(pixmap);  
    13.     screen.show();  
    14.     screen.showMessage("LOVE", Qt::AlignCenter, Qt::red);  
    15.   
    16.     MainWindow window;  
    17.     window.show();  
    18.   
    19.     screen.finish(&window);  
    20.   
    21.     return app.exec();  
    22. }  

    这个时候运行程序,发现确实出现了启动界面,但是启动界面一闪而过,根本没啥作用。

    2、然后,我们想到的就是是否可以加个延时,使得Mainwindow初始化和启动界面之间的时间久一点呢?

    下面是我们的第二段代码:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <QApplication>  
    2. #include <QSplashScreen>  
    3. #include <QPixmap>  
    4. #include <mainwindow.h>  
    5. #include <QDateTime>#include <QDebug>  
    6. int main(int argc, char *argv[])  
    7. {      
    8.     QApplication app(argc, argv);  
    9.     QPixmap pixmap("screen.png");      
    10.     QSplashScreen screen(pixmap);      
    11.     screen.show();      
    12.     app.processEvents();      
    13.     screen.showMessage("LOVE");  
    14.   
    15.     QDateTime n=QDateTime::currentDateTime();  
    16.     QDateTime now;      
    17.     do{      
    18.         now=QDateTime::currentDateTime();      
    19.     } while (n.secsTo(now)<=5);//6为需要延时的秒数  
    20.   
    21.   
    22.     MainWindow window;      
    23.     window.show();  
    24.     screen.finish(&window);  
    25.     return app.exec();  
    26. }  

    运行的结果依然是一闪而过,而且感觉加的延时不是启动画面的延时,而是程序开始运行的延时,也就是说过了5秒才显示启动画面,然后启动画面一闪而过,最后显示Mainwindow。

    插曲:这个时候,我就开始在网上查资料了,看到网上也是说要加延时,而且一定要加上“ app.processEvents(); ”这句话,不然程序睡眠,界面不会得到更新。

                 具体的就是参考下面两个文章。最终我才知道我调用事件处理的地方不对,应该是在延时的5s之内都调用的,不然这5s之内界面也不会更新。

                http://blog.csdn.net/dbzhang800/article/details/6300425

                http://mobile.51cto.com/hot-238884.htm

    3、有了上面的分析之后,下面两个做法都是可以的

        (1),在启动画面和Mwindow构造之前延时,且延时之间调用事件处理,代码如下,打开任意一个if 0,就可以了:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <QApplication>  
    2. #include <QSplashScreen>  
    3. #include <QPixmap>  
    4. #include <mainwindow.h>  
    5. #include <QDebug>  
    6. #include <QElapsedTimer>  
    7. #include <QDateTime>  
    8.   
    9. int main(int argc, char *argv[])  
    10. {  
    11.     QApplication app(argc, argv);  
    12.   
    13.     QPixmap pixmap("screen.png");  
    14.     QSplashScreen screen(pixmap);  
    15.     screen.show();  
    16.     screen.showMessage("LOVE", Qt::AlignCenter, Qt::red);  
    17. #if 0  
    18.     int delayTime = 5;  
    19.     QElapsedTimer timer;  
    20.     timer.start();  
    21.     while(timer.elapsed() < (delayTime * 1000))  
    22.     {  
    23.          app.processEvents();  
    24.     }  
    25. #endif  
    26.   
    27. #if 0  
    28.     QDateTime n=QDateTime::currentDateTime();  
    29.     QDateTime now;  
    30.     do{  
    31.         now=QDateTime::currentDateTime();  
    32.         app.processEvents();  
    33.     } while (n.secsTo(now)<=5);//5为需要延时的秒数  
    34. #endif  
    35.   
    36.     MainWindow window;  
    37.     window.show();  
    38.   
    39.     screen.finish(&window);  
    40.   
    41.     return app.exec();  
    42. }  

        (2)    在Mainwindow构造函数之中延时并且调用事件处理,这个跟QSplashScreen类中的finish()方法相关,不懂的可以看看说明。代码如下:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include "mainwindow.h"  
    2.   
    3. #include <QTextEdit>  
    4. #include <QDateTime>  
    5. #include <QCoreApplication>  
    6.   
    7. MainWindow::MainWindow(QWidget *parent) :  
    8.     QMainWindow(parent)  
    9. {  
    10.     QTextEdit *edit=new QTextEdit;  
    11.     edit->setText("Splash Example!");  
    12.     setCentralWidget(edit);  
    13.     resize(600,450);  
    14.   
    15.     QDateTime n=QDateTime::currentDateTime();  
    16.     QDateTime now;  
    17.     do{  
    18.         now=QDateTime::currentDateTime();  
    19.         QCoreApplication::processEvents();  
    20.     } while (n.secsTo(now)<=5);//5为需要延时的秒数  
    21. }  


    运行效果跟预期一样,截图如下:

    http://blog.csdn.net/chenlong12580/article/details/23713025

  • 相关阅读:
    好用的PasswordTextBox.
    可以修改Autocomplete高度和宽度的TextBox.(ComboBox也试用)
    Show WER and DMP file information
    在webBrowser中触发html页面中的javaScript.
    Trigger in sql server
    黑客来了。。。键盘钩子,听起来很高端。
    Send email
    (VB.net)自定义TableLayoutPanel使它能够在运行时用鼠标改变行高和列宽。
    (C#) Format the cell of DataGridView based on the TextBox.Text
    可以用来测显示屏的inch数。
  • 原文地址:https://www.cnblogs.com/findumars/p/4951393.html
Copyright © 2011-2022 走看看