2015-01-19 2 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++); 
    } 
} 

I로드의 상승 시간이 오래 기능을 추가했습니다. 앱 상태가되면 그림의 "그림자"를 볼 수 있습니다. 그림은 응용 프로그램 바로 전에 완전히로드 된 것 같습니다. 리소스와 절대 경로로 이미지를 시도했지만 문제가 동일합니다. Picture of the "shadow"

답변

6

일반적으로 QSplashScreen은 초기화 작업을 수행하는 동안 기본 창이 표시되기 전에 사용됩니다.

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

//Initialization 
... 

qApp->processEvents(QEventLoop::AllEvents); 

//Initialization 
... 

스플래쉬 화면에 표시되는 즉시 입력하는 QML 파일을로드 : 이벤트 루프가 시작되기 전에 시작 화면이 표시되기 때문에, 당신은 정기적으로 화면을 스플래시 관련 이벤트를 처리 할 수 ​​QApplication::processEvents()를 호출해야합니다 긴 루프이므로 스플래시 화면 이벤트가 처리되지 않습니다. 스플래시 화면을 표시 한 후 qml 파일을로드하기 전에 시도하십시오.

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

"qApp-> processEvents (QEventLoop :: AllEvents);"를 추가했습니다. "splash.show()"다음에 작동합니다. 감사 – helene

관련 문제