0

我有一个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中的错误还是我可以在我的代码中修复什么?

4

1 回答 1

0

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

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

如果您QSplashScreen *splash = new QSplashScreen;为每一帧创建一个新的初始屏幕,则应关闭并删除前一个屏幕。可以存储QSplashScreen *splash为类成员。否则会出现内存泄漏。

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


其他问题

QTimer不应每次都实例化以使用其静态成员函数。每次调用showFrame()andSplashScreen()创建一个QTimer永远不会被删除和使用的新对象。

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

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

于 2015-09-22T15:38:38.527 回答