2012-03-09 2 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

+0

Я думаю, было бы лучше сделать ваш MainWindow источником когда он будет инициализирован, и подключите его к заставке. –

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

+0

Главное окно выглядит нормально, но QSplashScreen по-прежнему не работает по мере необходимости – develoops

Смежные вопросы