2012-06-25 71 views
1

我的應用程序曾經在最新的美女更新之前工作,但不再工作。初始屏幕只適用於將init.qml文件和splashcreen.qml文件中的com.nokia.symbian 1.1降級到1.0,但不會顯示main.qml文件。當我指示main.cpp直接加載main.qml時,應用程序可以正常工作。我迷路了!下面是我對main.cpp中的代碼:QML啓動畫面不工作

#include <QtGui/QApplication> 
    #include "qmlapplicationviewer.h" 

    Q_DECL_EXPORT int main(int argc, char *argv[]) 
    { 
QScopedPointer<QApplication> app(createApplication(argc, argv)); 

QmlApplicationViewer viewer; 
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationLockPortrait); 
viewer.setSource(QUrl("qrc:/qml/SmartFlyer/init.qml")); 
//viewer.setMainQmlFile(QLatin1String("qrc:qml/SmartFlyer/main.qml")); 
viewer.showExpanded(); 

return app->exec(); 
    } 

對於init.qml:

import QtQuick 1.1 
    import com.nokia.symbian 1.1 

    Item { 
     id: init 

     SplashScreen { 
      id: splash 
      show: true    // show splash 
      minTimeout: 3000   // show splash at least for 3 sec 
    image: "data/splash_screen.png" // path to splash image 
    canFinish: false   // change to true when main QML will be loaded 
    z: 100     // highest page. 
} 

Loader { // this component performs deferred loading. 
    id: mainLoader 
    onStatusChanged: { 
     if(mainLoader.status == Loader.Ready) 
     { 
      // main page is loaded 
      // time to hide splash 
      splash.canFinish = true 
     } 
    } 
} 

Component.onCompleted: { 
    // splash is already rendered on the screen 
    // user is looking on splash 
    // now we can start loader to load main page 
    mainLoader.source = "main.qml" 
} 
    } 

而對於splashscreen.qml:

import QtQuick 1.1 
    import com.nokia.symbian 1.1 

    Rectangle { 
     id: splash 

     anchors.fill: parent 
     color: "black" 

property int minTimeout: 3000 // 3s by default. 
property string image;   // path to splash image 
property bool show: false  // if show is true then image opacity is 1.0, else 0.0 

property bool canFinish: false // if true then we can hide spash after timeout 

state: show ? "showingSplash" : "" 

onStateChanged: { 
    if(state == "showingSplash") 
     splashTimer.start(); 
} 

opacity: 0.0 

Image { 
    source: image 
    fillMode: Image.PreserveAspectFit 
    anchors.fill: parent 
    smooth: true 
} 

Timer { 
    id: splashTimer 
    interval: minTimeout 
    running: false 
    repeat: true 
    onTriggered: { 
     if(splash.canFinish) 
     { 
      // finally we can stop timer and hide splash 
      splash.show = false 
      splashTimer.repeat = false 
     } 
     else 
     { 
      // canFinish is false, but main.qml is not loaded yet 
      // we should run timer again and again 
      splashTimer.interval = 1000 // 1 sec 
      splashTimer.repeat = true 
     } 
    } 
} 

states: [ 
    State { 
     name: "showingSplash" 
     PropertyChanges { target: splash; opacity: 1.0 } 
    } 
] 

// hide splash using animation 
transitions: [ 
    Transition { 
     from: ""; to: "showingSplash" 
     reversible: true 
     PropertyAnimation { property: "opacity"; duration: 500; } 
    } 
] 
    } 

回答

2

至於我,我使用「老派」的方式來顯示Splash沒有任何QML。在這裏你可以看到,如何構建它,與放置在坡度的背景圖像標誌:

QSplashScreen *Application::buildSplashScreen() { 
    const QPixmap logoPixmap(":/images/logo.png"); 
    QDesktopWidget *desktop = QApplication::desktop(); 
    QRect desktopRect = desktop->availableGeometry(); 
    QPixmap splashPixmap(desktopRect.width(), desktopRect.height()); 
    QPainter painter; 
    painter.begin(&splashPixmap); 
    QLinearGradient backgroundGradient(splashPixmap.rect().width()/2, 
             0, 
             splashPixmap.rect().width()/2, 
             splashPixmap.rect().height()); 
    backgroundGradient.setColorAt(0, QColor::fromRgb(40, 50, 57)); 
    backgroundGradient.setColorAt(1, QColor::fromRgb(19, 25, 29)); 
    painter.fillRect(splashPixmap.rect(), backgroundGradient); 
    QRect logoRect((splashPixmap.width() - logoPixmap.width())/2, 
        (splashPixmap.height() - logoPixmap.height())/2, 
        logoPixmap.width(), 
        logoPixmap.height()); 
    painter.drawPixmap(logoRect, logoPixmap); 
    painter.end(); 
    QScopedPointer<QSplashScreen> splashScreen(new QSplashScreen(splashPixmap)); 
    if (desktopRect.width() > desktopRect.height()) { 
     splashScreen->setAttribute(Qt::WA_LockLandscapeOrientation, true); 
    } else { 
     splashScreen->setAttribute(Qt::WA_LockPortraitOrientation, true); 
    } 
    return splashScreen.take(); 
} 

然後我用這個手動內置飛濺當程序啓動:

int Application::run() { 
    QScopedPointer<QSplashScreen> splashScreen(buildSplashScreen()); 
    splashScreen->showFullScreen(); 
    QScopedPointer<QDeclarativeView> applicationWindow(buildRootView()); 
    splashScreen->finish(applicationWindow.data()); 
    applicationWindow->showFullScreen(); 
    return QApplication::exec(); 
}