2016/11/08(火) [n年前の日記]
#1 [python] お絵かきアプリモドキにUndoをつけた
PySideを使って書いてるお絵かきアプリモドキにUndoをつけた。とりあえず、キャンバス相当の QPixmap を配列? リスト? に記録していくだけの処理を入れてみたけど、一応それらしい動きになってくれた。
ただ、ちょっと気になる点が。Python で、配列の要素を削除した時、中身はちゃんと解放してくれているのだろうか…?
def save_undo(self): u"""キャンバスをUndoバッファに記憶.""" if len(self.undo_buf) > UNDO_MAX: del(self.undo_buf[0]) self.undo_buf.append(self.canvas_pixmap.copy()) def undo(self): u"""キャンバスをUndo.""" if len(self.undo_buf) > 0: pm = self.undo_buf.pop() self.canvas_pixmap = pm.copy() self.canvas_item.setPixmap(self.canvas_pixmap) return True return False
- キャンバス上でマウスクリックされたタイミングで、Undo用のデータを記録する。ブラシ描画する前にキャンバス相当の QPixmap をリストに格納。
- リストの要素数が一定数を超えていたら、最初の要素を削除してから、最後に QPixmap の copy を追加。
- Undo時は、リストの最後から copy してきて、リストの最後の要素を削除。
- buf.append(pixmap)ではポインタ(?)しか記録されないだろうから、ディープコピーをする QPixmap.copy() を呼んでる。つもりなのだけど、これで合ってるのかどうか…。
ただ、ちょっと気になる点が。Python で、配列の要素を削除した時、中身はちゃんと解放してくれているのだろうか…?
[ ツッコむ ]
以上です。