[farman] GIF アニメーション対応

farman の Image Viewer を GIF 及び WebP のアニメーションに対応させた。
farman_gif_anim.gif

QMovie というクラスを使うと、GIF 及び WebP をアニメーション表示させることができる。
クラス名から、mov 等の動画ファイルも再生できそうだが、これはできない。
QAnimation とかそーいう名前に変えたほうがいい気がするのだが。

http://doc.qt.io/qt-5/qmovie.html を読むと、QMovie クラスのインスタンスにファイル名もしくは QIODevice で読み込みたい画像のソースデータをセットし、QLabel のインスタンスに QMovie のインスタンスを setMovie() すればよいらしい。

既存の Image Viewer は画像を QPixmap のインスタンスにセットし、それを QGraphicsScene に addPixmap() することで実現している。
これと QMovie をどう共存させようか頭を悩ませていたが、結局 QMovie で JPEG 等の静止画もフツーに表示できることがわかったので、QPixmap を使わず QMovie に一本化することにし、ImageViewer のクラス内クラスとして ItemWidget という QLabel の派生クラスを以下のように定義した。

なお事前に画像ファイルは読み込み完了しており、QByteArray のインスタンスとして持っているので、これを ItemWidget のコンストラクタに渡している。
ItemWidget のインスタンスを生成したら、QGraphicsScene に addWidget() することで、表示される。

ちなみに QMovie は APNG には対応していない。(1コマ目のみ表示)
個人的にはそれほど必要としていないので問題は無いが、QMovie を APNG 対応させるプラグインが公開されている( https://github.com/Skycoder42/qapng )ので、もしニーズがあるようであれば対応も考えたい。

この記事へのコメント