Я хочу добавить заставку в приложение, которое загружается медленно.
Я создал простое приложение для тестирования.
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++);
}
}
Я добавил длинную функцию для увеличения времени загрузки.
Когда приложение заявит, я вижу «тень» картинки. Изображение кажется полностью загруженным непосредственно перед применением.
Я пробовал с изображением на ресурсах и с абсолютным путем, но проблема та же.
типично QSplashScreen
используется перед отображением основных окон, во время которых вы хотите выполнить некоторые задачи инициализации. Поскольку заставка отображается до начала цикла событий, вам следует периодически вызывать QApplication::processEvents()
для обработки событий, связанных с заставкой:
QSplashScreen splash(pixmap);
splash.show();
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
В вашем случае вы показываете заставку и сразу загружаете файл qml, который входит в длинный цикл, следовательно, события заставки не обрабатываются. Попробуйте это после отображения заставки и перед загрузкой файла qml:
qApp->processEvents(QEventLoop::AllEvents);