[PySide] クリップボードに画像を保存したらBoostNoteに保存する [Python]

BoostNoteネタは前回で終わりにするとかいいつつ、資料集めしているときに
クリップボードにいれたらBoostnoteにぶっこめたら便利だなぁと思ったのでPythonリハビリをかねてつくってみました。

クリップボードに画像が入ると、こんな感じのWindowが開いて、BoostNote上の指定のフォルダに
ページを作ってくれるようにしました。

QtDesignerでつくったUIは こちら

つづいて本体

基本はタスクトレイに常駐するアプリとして動作します。
クリップボードに画像が入ったら、それに応じてUIを表示して保存と言う流れ。

いくつかポイントをば。

クリップボードの監視方法

クリップボードを監視するには、QClipboardのdataChanged シグナルを使用します。

1つワナにはまったのが、このサンプルの場合 QApplicationのclipboard を使用していますが、
これを
QtGui.QClipboard.dataChanged
とすると、Pythonがエラーで落ちてしまいます(しばらくハマる)

クリップボードの中身は、

mimeDataで判別ができるので、コレを使用して画像のみに反応するようにすればOKです。

UIを最前面に表示

保存するかどうかのUIは、問答無用で一番前に出て欲しかったので、setWindowFlagsで
UIを最前面にでるようにしました。

QtCore.Qt.Window は無くても良いのかなと思ったのですが、これがないとWindowが
表示されませんでした。なんというトラップ(汗

クリップボードの画像をUIに表示&保存

Labelに画像を貼り付ける場合、

まず、Designerで scaledContents にチェックを入れておきます。
コレをいれることで、UI上に画像表示したときに、スケールされて表示できるようになります。
(いれていないと、元サイズの一部だけ表示されるようになる)

Labelに貼るには、setPixmapにセットすればOKですが、
clipboard.image()で取得できるのはQImageでそのままだとErrorになってしまうので
QPixmapを間にいれてあげます。

画像を保存するには、QImageに saveメソッドがあるので、それを使えばOKです。

指定時間後にUIを閉じる

ずっとUIがでたままのはウザいので、指定秒数後に閉じるようにしたい場合は
別スレッドでsleepした後close()してあげればOK。

このThreadですが、当初 runの中に self.window.show() と入れていたのですが、
その場合、エラーになってしまい正しく表示出来ませんでした。
このへんのThreadの挙動はイマイチよーわからんです(汗

 

一応コレでやりたい事は出来たのですが、ぶっちゃけ画像コピーするたびに画面が出るのは
かなりウザいので、表示位置などはもうちょっと考える必要があるのかなぁと思います(汗

とはいえ、クリップボード周りの監視・拡張は色々と出来そうなのでイイカンジですね。

やっぱりPythonは楽でいいなぁ…

参考

コメントを残す

メールアドレスが公開されることはありません。

*