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