QSplashScreen 消失得太快

Posted

技术标签:

【中文标题】QSplashScreen 消失得太快【英文标题】:QSplashScreen disappears too quickly 【发布时间】:2020-03-17 12:43:36 【问题描述】:

我试图在启动我的应用程序之前显示QSplashScreen问题我的问题是QSplashScreen 消失得太快了。我希望它在实际应用程序加载之前显示 2 秒。 下面是我为显示错误而构建的小示例:

#include <QApplication>
#include <QSplashScreen>
#include <QTimer>

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

    QTimer::singleShot(2500, splash, SLOT(close()));
    MainWindow w;
    QTimer::singleShot(2500, &w, SLOT(show()));

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();
    delete splash;
    return a.exec();

编辑使用来自official documentation的QSplashScreen::finish()

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

    MainWindow w;

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();    
    splash->finish(&w);

    return a.exec();

EDITS 2使用类:

#include <QApplication>
#include <QSplashScreen>
#include <QTimer>

class ShowImageTime 
public:
    void slInit();
;

int main(int argc, char *argv[])


    QApplication a(argc, argv);

    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap(":/dredgingSplash.png"));
    splash->show();
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("Setting up the main window..."), topRight, Qt::white);

    MainWindow w;

    QTimer::singleShot(3000, splash, SLOT(close()));// close splash after 4s
    QTimer::singleShot(3000, &w, SLOT(ShowImageTime::slInit(this->show)));// mainwindow reappears after 4s

    splash->showMessage(QObject::tr("loading modules..."), topRight, Qt::white);
    splash->showMessage(QObject::tr("Establishing Connections..."), topRight, Qt::white);

    w.show();    
    splash->finish(&w);

    return a.exec();

我尝试使用QTimer,因为我认为这可能是由于加载优先级而导致的潜在问题,但不幸的是,如果我将QTimer::singleShot(2500, splash, SLOT(close())); 更改为QTimer::singleShot(12500, splash, SLOT(close())); 甚至更高的数字,实际上没有区别,所以我不确定为什么这不是一个选项。

我还遇到了this source,我也关注了official documentation,但这也无助于我找出问题所在。 另外this post 表明问题一直与QTimer 相关,但我不明白如何,因为更大或更小的间隔似乎不算数。

为了让QSplashScreen 保持 2 秒而不是立即消失(甚至看不到它),我缺少什么? 感谢您指出正确的方向。

【问题讨论】:

您是否尝试使用QSplashScreen::finish() 函数而不是计时器? 你好 vahancho,不,我没有,但我先试一试 它没有任何区别。来自here,我应该对示例代码进行哪些修改? QTimer 是否仍然需要或不再需要? 你根本不需要计时器,IMO。请查看您引用的同一页面以查看使用示例。您应该在w.show() 调用后调用splash-&gt;finish(&amp;w); 并删除所有计时器。 好的,我明白了。是的,它现在可以在没有QTimers 的情况下使用,但图像仍然会很快消失。我怎样才能让它停留 2 秒呢? 【参考方案1】:

问题是,您的代码正在启动计时器,然后继续运行。所以 MainWindow 被创建,显示和 SplashScreen 被删除/完成。定时器的超时功能将在这一切发生后触发。这就是它关闭得如此之快的原因。

如果应用程序启动很慢,通常会显示 SplashScreens,因为后台发生了很多事情。在您的情况下,基本上没有负载,并且代码执行得非常快。

您可以在调用splash-&gt;show() 后立即使用睡眠调用 2 秒,或者将所有用于关闭 SplashScreen 的代码,在计时器的超时槽中显示主窗口并删除那里的 SplashScreen。

【讨论】:

以上是关于QSplashScreen 消失得太快的主要内容,如果未能解决你的问题,请参考以下文章

当我的脸移动得太快时,OpenCV 人脸检测会中断

如何使用`setr​​limit`来限制内存使用? RLIMIT_AS 杀得太快; RLIMIT_DATA、RLIMIT_RSS、RLIMIT_STACK 根本不杀死

Picker View 数据消失太快

Javascript 闪屏 setTimeout 问题。

Javascript函数调用太快[重复]

jQuery 问题 - mouseover/mouseout 太快