у меня есть 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 или я могу что-то исправить в своем коде?
Там создано 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
не используется
Других решений пока нет …