Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt splashscreen赢得';关不上_C++_Qt_Splash Screen_Qsplashscreen - Fatal编程技术网

C++ Qt splashscreen赢得';关不上

C++ Qt splashscreen赢得';关不上,c++,qt,splash-screen,qsplashscreen,C++,Qt,Splash Screen,Qsplashscreen,我制作了一个qsplashsscreen,它在一堆图像中运行,类似于gif,并在主窗口打开时关闭。这在windows上运行很好,但当我在mac上运行它时,它会变得很时髦。而不是关闭时,它通过所有的图片一样,它应该开始在图像中按相反的顺序点击 这是标题(splashscreen.h): 下面是实现(splashscreen.cpp): 我有几种不同的方法来关闭启动屏幕,但它们似乎都不起作用。这是Mac电脑中的一个bug还是我可以在代码中修复一些东西?创建了90个不同的qsplashsscreen对

我制作了一个
qsplashsscreen
,它在一堆图像中运行,类似于gif,并在主窗口打开时关闭。这在windows上运行很好,但当我在mac上运行它时,它会变得很时髦。而不是关闭时,它通过所有的图片一样,它应该开始在图像中按相反的顺序点击

这是标题(splashscreen.h):

下面是实现(splashscreen.cpp):


我有几种不同的方法来关闭启动屏幕,但它们似乎都不起作用。这是Mac电脑中的一个bug还是我可以在代码中修复一些东西?

创建了90个不同的
qsplashsscreen
对象。只有第90个对象处于关闭状态

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

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

您可以考虑只使用一个实例<代码> QSPLAdStutsPrase作为私有<代码> SpulsFiels类成员。代码的其余部分可以保持不变(用

splash.
替换
splash->
后)。通过删除
SplashScreen
,它将被自动删除


其他问题

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

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

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

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::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;
    }
}
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();
}