質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

7046閲覧

pyqt5でドラッグ&ドロップで画像を取得、表示したい

uc200

総合スコア32

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/12/05 01:47

###前提・実現したいこと
python3.5を使っています。pyqt5を用いてウィンドウに画像をドラッグ&ドロップした時にその画像が表示されるようにしたいです。

###発生している問題・エラーメッセージ

jpg画像をドラッグしてもドロップ可能の表示が出ません。当然ドロップしても何も起こりません。

###該当のソースコード

ウィンドウの左上の、縦、横100ピクセルの領域に画像をドラッグ&ドロップすると、ウィンドウの座標(150,150)の位置からその画像が表示されるコードのつもりで書きました。

python3

1import sys 2from PyQt5.QtWidgets import (QPushButton, QWidget, 3 QLineEdit, QApplication) 4from PyQt5.QtCore import * 5from PyQt5.QtGui import * 6from PyQt5.QtWidgets import * 7 8 9 10class Button(QPushButton): 11 12 def __init__(self, title, parent): 13 super().__init__(title, parent) 14 15 self.setAcceptDrops(True) 16 17 18 def dragEnterEvent(self, e): 19 20 if e.mimeData().hasFormat('image/*'): 21 e.accept() 22 else: 23 e.ignore() 24 25 def dropEvent(self, e): 26 self.label.setPixmap(QPixmap(event.mimeData().imageData())) 27 28 29class Example(QWidget): 30 31 def __init__(self): 32 super().__init__() 33 34 self.initUI() 35 36 37 def initUI(self): 38 39 button = Button("",self) 40 button.resize(100,100) 41 button.setIcon(QIcon("gazo1.jpg")) 42 button.setIconSize(QSize(100,100)) 43 button.move(0, 0) 44 45 self.label = QLabel(self) 46 self.label.setPixmap(QPixmap('gazo2.jpg')) 47 self.label.move(150,150) 48 49 self.setWindowTitle('Simple drag & drop') 50 self.setGeometry(300, 300, 300, 300) 51 52 53if __name__ == '__main__': 54 55 app = QApplication(sys.argv) 56 ex = Example() 57 ex.show() 58 app.exec_() 59

###試したこと
ドラッグ&ドロップを用いたコードの例として、次のコードを参考にしました。

import sys from PyQt5.QtWidgets import (QPushButton, QWidget, QLineEdit, QApplication) class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) self.setAcceptDrops(True) def dragEnterEvent(self, e): if e.mimeData().hasFormat('text/plain'): e.accept() else: e.ignore() def dropEvent(self, e): self.setText(e.mimeData().text()) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): edit = QLineEdit('', self) edit.setDragEnabled(True) edit.move(30, 65) button = Button("Button", self) button.move(190, 65) self.setWindowTitle('Simple drag & drop') self.setGeometry(300, 300, 300, 150) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() app.exec_()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

デスクトップ上などから画像ファイルをドラッグ&ドロップする場合の回答です。
dragEnter時、MIMETypeimage/*は含まれませんのでhasUrls()でパスの有無で判断します。
パスがある場合にacceptすることで、ドロップ可能の表示になります。
drop時には、実際にファイルから画像を読込んでラベルにセットします。

ウインドウ内の画像(ラベル)をドラッグ&ドロップする手法については未調査です。

参考:
PyQtでファイルのドラッグ&ドロップ
PyQtでドラッグアンドドロップを実装する

Python

1import sys 2from PyQt5.QtWidgets import (QPushButton, QWidget, QLabel, QApplication) 3from PyQt5.QtGui import ( QIcon, QPixmap) 4from PyQt5.QtCore import QSize 5 6myLabel = None 7 8class Button(QPushButton): 9 10 def __init__(self, title, parent): 11 super().__init__(title, parent) 12 self.setAcceptDrops(True) 13 14 def dragEnterEvent(self, e): 15 mimeData = e.mimeData() 16 17 # MIMETypeの確認表示 18 for mimetype in mimeData.formats(): 19 print('MIMEType:', mimetype) 20 21 # パスの有無で判定 22 if mimeData.hasUrls(): 23 e.accept() 24 else: 25 e.ignore() 26 27 def dropEvent(self, e): 28 # ファイルから画像読込 29 urls = e.mimeData().urls() 30 path = urls[0].toLocalFile() 31 pix = QPixmap() 32 if pix.load(path): 33 myLabel.setPixmap(pix) 34 35class Example(QWidget): 36 37 def __init__(self): 38 super().__init__() 39 self.initUI() 40 41 def initUI(self): 42 button = Button("",self) 43 button.resize(100,100) 44 button.setIcon(QIcon("gazo1.jpg")) 45 button.setIconSize(QSize(100,100)) 46 button.move(0, 0) 47 48 self.label = QLabel(self) 49 self.label.setPixmap(QPixmap('gazo2.jpg')) 50 self.label.move(150,150) 51 52 global myLabel 53 myLabel = self.label 54 55 self.setWindowTitle('Simple drag & drop') 56 self.setGeometry(300, 300, 300, 300) 57 58 59if __name__ == '__main__': 60 61 app = QApplication(sys.argv) 62 ex = Example() 63 ex.show() 64 app.exec_()

投稿2017/12/07 04:13

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uc200

2017/12/08 00:42

URLで確認するんですね。 ありがとうございます! おかげ様で思った通りの動作をしてくれました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問