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++);
}
}

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

4

Решение

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

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

//Initialization
...

qApp->processEvents(QEventLoop::AllEvents);

//Initialization
...

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

qApp->processEvents(QEventLoop::AllEvents);
6

Другие решения


По вопросам рекламы [email protected]