Qt splashscreen不会关闭

时间:2015-09-22 13:20:05

标签: c++ qt splash-screen qsplashscreen

我制作了一个QSplashScreen,它通过一堆图像运行,类似于gif,并在主窗口打开时关闭。这在windows上工作正常,但是当我在mac上运行时,它变得很时髦。它不是在它完成所有图片时关闭它应该在点击时以相反的顺序开始浏览图像。

这是标题( splashscreen.h ):

class SplashScreen : public QObject
{
    Q_OBJECT

public:
    explicit SplashScreen(QObject *parent = 0);

private:
    QString filename0;
    QString filename1;
    QString filename;

    int frameNum;

    Qt::WindowFlags flags;

private slots:
        void showFrame(void);
};

这是实现( splashscreen.cpp ):

SplashScreen::SplashScreen(QObject *parent) :
    QObject(parent)
{
    QTimer *timer = new QTimer;
    timer->singleShot(0, this, SLOT(showFrame()));
    frameNum = 0;
}

void SplashScreen::showFrame(void)
{
    QSplashScreen *splash = new QSplashScreen;
    QTimer *timer = new QTimer;

    frameNum++;

    QString filename0 = ""; //first and second half of file path
    QString filename1 = "";
    splash->showMessage("message here", Qt::AlignBottom, Qt::black); 

    filename = filename0 + QString::number(frameNum) +filename1; // the number for the file is added here
    splash->setPixmap(QPixmap(filename)); // then shown in the splashscreen
    splash->show();

    if (frameNum < 90)
    {
        timer->singleShot(75, this, SLOT(showFrame()));
    }
    else if (frameNum == 90)
    {
        splash->close();
        flags |= Qt::WindowStaysOnBottomHint;
        return;
    }
}

这是主文件( main.cpp ):

int main(int argc, char *argv[]) 
{
    Application app(argc, argv);

    SplashScreen *splash = new SplashScreen;
    QSplashScreen *splashy = new QSplashScreen;

    View view; //main window

    QTimer::singleShot(10000, splashy, SLOT(close()));
    splashy->hide();
    QTimer::singleShot(10000, &view, SLOT(show()));

    return app.exec();
}

我有几种不同的方法来关闭启动画面,但它们似乎都没有工作。这是mac中的错误还是我可以在我的代码中修复一些内容?

1 个答案:

答案 0 :(得分:0)

创建了90个不同的QSplashScreen个对象。只关闭了第90个对象。

因此,这是观察行为的主要原因。

如果为每个帧创建一个新的启动画面QSplashScreen *splash = new QSplashScreen;,则应关闭并删除上一个屏幕。可以将QSplashScreen *splash存储为类成员。否则会有内存泄漏。

您可以考虑仅使用QSplashScreen splash的一个实例作为私有SplashScreen类成员。其余代码可以保持不变(在splash->替换splash.之后)。它会在删除SplashScreen时自动删除。

其他问题

每次使用静态成员函数时,不应实例化

QTimershowFrame()SplashScreen()的每次调用都会创建一个永不删除且永不使用的新QTimer对象。

splashymain()中也没有任何意义。可以删除与splashy相关的所有三行。实际的启动屏幕由new SplashScreen触发。顺便说一句,它也是一个泄漏。在这种情况下,直接在main()函数堆栈上实例化它是有意义的:SplashScreen splash;

看起来没有使用私人成员SplashScreen::flags