QSplashScreen исчезает слишком быстро - PullRequest
0 голосов
/ 17 марта 2020

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

#include <QApplication>
#include <QSplashScreen>
#include <QTimer>

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

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

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

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();
    delete splash;
    return a.exec();
}

РЕДАКТИРОВАТЬ используя QSplashScreen::finish() из официальной документации :

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

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

    MainWindow w;

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();    
    splash->finish(&w);

    return a.exec();
}

РЕДАКТИРОВАТЬ 2 используя класс:

#include <QApplication>
#include <QSplashScreen>
#include <QTimer>

class ShowImageTime {
public:
    void slInit();
};

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

    QApplication a(argc, argv);

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

    MainWindow w;

    QTimer::singleShot(3000, splash, SLOT(close()));// close splash after 4s
    QTimer::singleShot(3000, &w, SLOT(ShowImageTime::slInit(this->show)));// mainwindow reappears after 4s

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();    
    splash->finish(&w);

    return a.exec();
}

Я пытался играть с QTimer, так как думал, что это может быть потенциальной проблемой из-за приоритета загрузки, но, к сожалению, если я изменю QTimer::singleShot(2500, splash, SLOT(close())); с QTimer::singleShot(12500, splash, SLOT(close())); или даже более высокими числами, в буквальном смысле нет никакой разницы, поэтому я не уверен, почему это не вариант.

Также я наткнулся на этот источник и я также следовал официальная документация но это также не помогло мне разобраться в проблеме. Также этот пост предполагает, что проблема по-прежнему связана с QTimer, но я не вижу, как, так как большие или меньшие интервалы, кажется, не учитываются.

Чего мне не хватает, чтобы сохранить QSplashScreen остаться на 2 секунды вместо того, чтобы исчезнуть (или даже не увидеть это) сразу? Спасибо за указание в правильном направлении.

1 Ответ

1 голос
/ 18 марта 2020

Проблема в том, что ваш код запускает таймер, а затем продолжает работать. Таким образом, MainWindow создается, отображается, а SplashScreen удаляется / завершается. Функция таймера таймера сработает после всего этого. Вот почему он закрывается так быстро.

SplashScreens обычно отображаются, если запуск приложения очень медленный, потому что в фоновом режиме происходит так много всего. В вашем случае, в основном, нет загрузки, и код выполняется очень быстро.

Вы можете использовать спящий вызов для 2se c сразу после вызова splash->show() или поместить весь код для закрытия SplashScreen, показывая главное окно в слоте таймера и удалите там экран SplashScreen.

...