Qt : 在应用程序加载过程中显示图片

问题描述 投票:4回答:2

我想为一个加载缓慢的应用程序添加一个闪屏,我创建了一个简单的应用程序来测试。

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"

c++ qt qml qpixmap qsplashscreen
2个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.