2012-03-09 32 views
1

我試圖使用QSplashScreen顯示啓動圖像,我想要顯示圖像約2秒。沒有調用QSplashScreen的插槽

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    QPixmap pixmap(":/images/usm.png"); 
    QSplashScreen splash(pixmap); 
    splash.show(); 
    splash.showMessage("Loading Processes"); 
    QTimer::singleShot(2000, &splash, SLOT(close())); 
    MainWindow w; 
     w.show(); 

    splash.finish(&w); 
    return a.exec(); 
} 

但是這不起作用。 QSplashScreen會在幾毫秒後出現,然後消失。試圖修改時間段,但似乎QSplashScreen對象沒有連接到插槽。有什麼問題以及如何避免它?

回答

4

與您的代碼的問題是,這樣的閃屏已與splash.finish(&w)調用關閉計時器沒有阻止執行。你需要的是睡眠。你可以使用一個QWaitCondition這樣的:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QSplashScreen splash(QPixmap(":/images/usm.png")); 
    splash.show(); 
    splash.showMessage("Loading Processes"); 

    // Wait for 2 seconds 
    QMutex dummyMutex; 
    dummyMutex.lock(); 
    QWaitCondition waitCondition; 
    waitCondition.wait(&dummyMutex, 2000); 

    MainWindow w; 
    w.show(); 

    splash.finish(&w); 
    return a.exec(); 
} 

這種方法的缺點是,你阻止執行。如果您不想阻止它,那麼你可以簡單地刪除電話splash.finish(&w)

int main(int argc, char *argv[]) { 

    QApplication a(argc, argv); 
    QPixmap pixmap(":/images/usm.png"); 
    QSplashScreen splash(pixmap); 
    splash.show(); 
    splash.showMessage("Loading Processes"); 
    QTimer::singleShot(2000, &splash, SLOT(close())); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
} 
+0

第二種方法工作出色.. thx很多 – develoops 2012-03-09 19:31:33

+0

我認爲這會更好,讓您的MainWindow發出一個初始化完成後發出信號,並將其連接到閃屏。 – 2012-03-09 20:51:06

1

此代碼應工作:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QSplashScreen splash(QPixmap(":/images/usm.png")); 
    splash.showMessage("Loading Processes"); 
    splash->show(); 

    QMainWindow w; 

    QTimer::singleShot(2000, splash, SLOT(close())); 
    QTimer::singleShot(2500, &w, SLOT(show())); 

    return a.exec(); 
} 
+0

不QTimer依賴於事件循環?沒有開始之前a.exec()... – Koying 2012-03-09 18:19:38

+0

以及主窗口出現normall,但QSplashScreen仍然不能按需工作 – develoops 2012-03-09 18:37:26