Слот не вызван для QSplashScreen - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь показать загрузочное изображение, используя QSplashScreen, и я хочу показать изображение в течение примерно 2 секунд.

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 не подключен к слоту. В чем проблема и как ее избежать?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Проблема с вашим кодом в том, что таймер не блокирует выполнение, поэтому заставка уже закрылась с вызовом 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();
}
1 голос
/ 09 марта 2012

Этот код должен работать:

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();
}
...