2015-01-19 4 views
4

Я хочу добавить заставку в приложение, которое медленно загружается. Я создал простое приложение для тестирования.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++); 
    } 
} 

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

ответ

6

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

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

//Initialization 
... 

qApp->processEvents(QEventLoop::AllEvents); 

//Initialization 
... 

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

qApp->processEvents(QEventLoop::AllEvents); 
+2

Я добавил «qApp-> processEvents (QEventLoop :: AllEvents);" после "splash.show()", и он работает. благодаря – helene

Смежные вопросы