PyQt5使ったけど、たぶんPySideでも通じると思うのでタグ登録。
コピーしてログ生成するGUI
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のアドレスを直接輸送する。
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がでてしまう。
def dropEvent(self,event):
try:
rmodel = event.mimeData().rmodel
ritems = event.mimeData().ritems
rflag = True
except:
rflag = False
if rflag:
これでListからやってきたアイテムの場合とファイラーからやってきたアイテムの場合とで処理をそれぞれ設定できる。