LoginSignup
3
2

More than 5 years have passed since last update.

[PyQt][PySide] CopyWithLogつくってみました。

Last updated at Posted at 2015-10-29

PyQt5使ったけど、たぶんPySideでも通じると思うのでタグ登録。

コピーしてログ生成するGUI

screenshot
inon3135/CopyWithLog
ドラッグ&ドロップしたファイルをコピーして、コピー先/元にログファイルを作るソフト。
自分自身の備忘録も兼ねてやったことを幾つか書いていきます。

DragDrop設定の注意点

他記事でも書いたけど、View, model, widgetでのDragDrop設定について。
widget->View->model->itemの順で入れ子構造(のイメージ)
ここでview, modelを指定した場合はviewで設定する。
widgetのデフォルト設定を使う場合はwidget上で設定する。

QMimeDataにデータを追加する

DragDropで情報を扱うにはQMimeDataをいじる。
DragEnter&Dropの時は情報を引き出すだけなのでよし。
DragLeave&Dropの時の挙動はQMimeDataにどういった情報を与えるかを設定する。実際のアクションの設定はDropされる側で設定することになる。

widget->view->model->item

QMimeDataはmodelで設定する。
QMimeDataが元から持っているurls, text, imageなどの情報を設定するとQtアプリケーション以外でも設定されているように挙動する。

でも予想外の操作で想定外の問題発生しても面倒なので今回は使わない。

QListWidgetからQTreeWidgetへ情報を輸送

輸送したい情報はurlやtextの情報なのだが、前述のとおりQMimeDataのデフォルトに設定すると思わぬ挙動をする可能性が高い。
そこで、QMimeDataに新しい変数を追加して情報を受け渡す。

今回は情報だけじゃなくて操作もQTreeWidgetから行いたいので、modelとitemのアドレスを直接輸送する。

Model->QMimeData
    def mimeData(self,indexes):
        mime = QMimeData()
        mime.rmodel = self
        items = []
        for index in indexes:
            items.append(self.item(index.row()))

        mime.ritems = items
        return mime

ritemsにDragされたアイテムのアドレスリスト。
rmodelにitemが格納されているモデルのアドレス。

この情報をQTreeWidgetから取得するが、QTreeWidgetはUrlsからでも動作するようにした。
そのため、ちょっと気をつけないとErrorがでてしまう。

Tree->View->DropEvent
    def dropEvent(self,event):
        try:
            rmodel = event.mimeData().rmodel
            ritems = event.mimeData().ritems
            rflag = True
        except:
            rflag = False

        if rflag:

これでListからやってきたアイテムの場合とファイラーからやってきたアイテムの場合とで処理をそれぞれ設定できる。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2