Заставка Qt не закрывается

у меня есть 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

Решение

Там создано 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 не используется

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]