Qt:在应用程序加载期间显示图片
Qt : Display a picture during application loading
我想为加载缓慢的应用程序添加启动画面。
我已经创建了一个简单的应用程序来测试。
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++);
}
}
我添加了一个 long 函数来增加加载时间。
当应用程序状态时,我可以看到图片的 "the shadow"。图片似乎在应用程序之前完全加载。
我试过在资源上使用图像和绝对路径,但问题是一样的。
通常 QSplashScreen
在显示主要 windows 之前使用,在此期间您要执行一些初始化任务。由于闪屏是在事件循环开始之前显示的,所以你应该定期调用QApplication::processEvents()
来处理与闪屏相关的事件:
QSplashScreen splash(pixmap);
splash.show();
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
在您的情况下,您正在显示启动画面并立即加载进入长循环的 qml 文件,因此不会处理启动画面事件。在显示初始屏幕后和加载 qml 文件之前尝试此操作:
qApp->processEvents(QEventLoop::AllEvents);
我想为加载缓慢的应用程序添加启动画面。 我已经创建了一个简单的应用程序来测试。
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++);
}
}
我添加了一个 long 函数来增加加载时间。
当应用程序状态时,我可以看到图片的 "the shadow"。图片似乎在应用程序之前完全加载。
我试过在资源上使用图像和绝对路径,但问题是一样的。
通常 QSplashScreen
在显示主要 windows 之前使用,在此期间您要执行一些初始化任务。由于闪屏是在事件循环开始之前显示的,所以你应该定期调用QApplication::processEvents()
来处理与闪屏相关的事件:
QSplashScreen splash(pixmap);
splash.show();
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
qApp->processEvents(QEventLoop::AllEvents);
//Initialization
...
在您的情况下,您正在显示启动画面并立即加载进入长循环的 qml 文件,因此不会处理启动画面事件。在显示初始屏幕后和加载 qml 文件之前尝试此操作:
qApp->processEvents(QEventLoop::AllEvents);