Qt:在应用程序加载期间显示图片

4
我想在一个加载较慢的应用程序中添加启动画面。我创建了一个简单的应用程序进行测试。
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++);
    }
}

我添加了一个长函数来提高加载时间。 当应用程序处于状态时,我可以看到图片的“阴影”。在应用程序之前,图片似乎完全加载。 我尝试过使用资源中的图像和绝对路径,但问题是相同的。
1个回答

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
我在 "splash.show()" 后面添加了 "qApp->processEvents(QEventLoop::AllEvents);",现在它可以正常工作了。谢谢。 - helene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接