Qt: Показать картинку во время загрузки приложения

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

main.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPixmap pixmap("/home/helene/Images/my_image.png");
    if (pixmap.isNull())
    {
        pixmap = QPixmap(300, 300);
        pixmap.fill(Qt::magenta);
    }

    QSplashScreen *splash = new QSplashScreen(pixmap);
    splash->show();
    splash->showMessage("Loaded modules dsjhj");

    QQmlApplicationEngine engine;
    engine.load(QUrl("qrc:/main.qml"));

    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    if ( !window )
    {
        qWarning("Error: Your root item has to be a Window.");
        return -1;
    }
    else
    {
        window->showFullScreen();
    }
    return app.exec();
}

main.qml

Window {
    visible: false
    width: 360
    height: 360

    property variant t: determineT()
    MouseArea {
        anchors.fill: parent
        onClicked: {
            Qt.quit();
        }
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }

    function determineT() {
        for(var i=0; i<1000000000; i++);
    }
}

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

1 ответ

Решение

Типично QSplashScreen используется перед показом основных окон, во время которых вы хотите выполнить некоторые задачи инициализации. Поскольку заставка отображается до запуска цикла событий, вам следует периодически вызывать QApplication::processEvents() для обработки событий, связанных с заставкой:

QSplashScreen splash(pixmap);
splash.show();
qApp->processEvents(QEventLoop::AllEvents);

//Initialization
...

qApp->processEvents(QEventLoop::AllEvents);

//Initialization
...

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

qApp->processEvents(QEventLoop::AllEvents);
Другие вопросы по тегам