我制作了一个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中的错误还是我可以在我的代码中修复一些内容?
答案 0 :(得分:0)
创建了90个不同的QSplashScreen
个对象。只关闭了第90个对象。
因此,这是观察行为的主要原因。
如果为每个帧创建一个新的启动画面QSplashScreen *splash = new QSplashScreen;
,则应关闭并删除上一个屏幕。可以将QSplashScreen *splash
存储为类成员。否则会有内存泄漏。
您可以考虑仅使用QSplashScreen splash
的一个实例作为私有SplashScreen
类成员。其余代码可以保持不变(在splash->
替换splash.
之后)。它会在删除SplashScreen
时自动删除。
其他问题
每次使用静态成员函数时,不应实例化 QTimer
。 showFrame()
和SplashScreen()
的每次调用都会创建一个永不删除且永不使用的新QTimer
对象。
splashy
在main()
中也没有任何意义。可以删除与splashy
相关的所有三行。实际的启动屏幕由new SplashScreen
触发。顺便说一句,它也是一个泄漏。在这种情况下,直接在main()
函数堆栈上实例化它是有意义的:SplashScreen splash;
看起来没有使用私人成员SplashScreen::flags
。