사용자가 기본 창을 기다리는 동안 작은 애니메이션 (애니메이션 GIF)을 표시해야하는 간단한 스플래시 화면 확장자가 있습니다. 문제는 첫 번째 프레임 만이 아니라 모든 도시되어있다 :QSplashScreen에 QMovie 표시
class SplashScreen : public QSplashScreen
{
Q_OBJECT
public:
explicit SplashScreen(const QPixmap& pixmap, const QString& animation, Qt::WindowFlags flags = 0);
protected:
void paintEvent(QPaintEvent* event);
signals:
void frameChanged();
private slots:
void convertFrameChanged(int)
{
repaint();
}
private:
QMovie movie;
};
SplashScreen::SplashScreen(const QPixmap& pixmap, const QString& animation, Qt::WindowFlags flags)
: QSplashScreen(pixmap, flags),
movie(animation)
{
movie.start();
connect(&(movie), SIGNAL(frameChanged(int)), this, SLOT(convertFrameChanged(int)));
}
void SplashScreen::paintEvent(QPaintEvent* event)
{
QSplashScreen::paintEvent(event);
QPixmap frame = movie.currentPixmap();
QRect rect = frame.rect();
rect.moveCenter(this->rect().center());
if (rect.intersects(event->rect()))
{
QPainter painter(this);
painter.drawPixmap(rect.left(), rect.top(), frame);
}
}
편집 : 스플래시 스크린에
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doRefresh()));
timer->start(1000);
라이트 슬롯 :
가되는 SplashScreen 생성자 QTimer으로 칠 호출 시도 :
void doRefresh()
{
repaint();
}
그러나 이것도 작동하지 않았습니다. doRefresh가 호출되지 않습니다. 그것은 QTimer 또한 기존의 이벤트 루프가 이미 필요합니다 보인다.
관련성이 있지만 문제가 해결되지 않았을 수 있습니다. GIF는 첫 번째 프레임 만 표시합니다. QMovie는 frameChanged 이벤트를 한 번만 내 보냅니다 (그러나 gif에는 둘 이상의 이벤트가 있음). – Beachwalker
질문에 주 코드를 추가하여 스플래시 화면과 QApplication을 인스턴스화 할 수 있습니까? – TheDarkKnight
이제는 모두 작동합니까? – TheDarkKnight