40088


python3.5を使っています。pyqt5を用いてウィンドウに画像をドラッグ&ドロップした時にその画像が表示されるようにしたいです。しかし、jpg画像をドラッグしてもドロップ可能の表示が出ません。当然ドロップしても何も起こりません。イメージとしては、下図のように左上の領域に画像をドラッグ&ドロップした時に、ウィンドウの中央にその画像が表示されるようにしたいです。

しかし、画像をドラッグしてもドロップ可能のマークが出ません。当然、ドロップしても何も起こりません。

[![画像の説明をここに入力](https://i.stack.imgur.com/iz8Vu.png)](https://i.stack.imgur.com/iz8Vu.png)

[code]

    import sys
    from PyQt5.QtWidgets import (QPushButton, QWidget,
        QLineEdit, QApplication)
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    
    
    class Button(QPushButton):
    
        def __init__(self, title, parent):
            super().__init__(title, parent)
    
            self.setAcceptDrops(True)
    
    
        def dragEnterEvent(self, e):
            #print(e.mimeData().formats())
        
            if e.mimeData().hasFormat(e.mimeData().formats()):
                e.accept()
            else:
                e.ignore()
            
    
        def dropEvent(self, e):
            self.label.setPixmap(QPixmap(event.mimeData().imageData())) 
    
    
    class Example(QWidget):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            button = Button("",self)
            button.resize(100,100) 
            button.setIcon(QIcon("drdr.png")) 
            button.setIconSize(QSize(100,100))
            button.move(0, 0)
    
            self.label = QLabel(self)
            self.label.setPixmap(QPixmap('image.png'))
            self.label.move(150,150)
            
            self.setWindowTitle('Simple drag & drop')
            self.setGeometry(300, 300, 300, 300)
    
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
        ex = Example()
        ex.show()
        app.exec_()
    
[/code]


CC BY-SA 4.0
2017-12-05T18:31:41.987
40065
2021-03-09T05:02:50.810
2021-03-09T05:02:50.810
3060
26529
question
python3 pyqt5
pyqt5でドラッグ&ドロップで画像を取得、表示したい


画像をドラッグした際に、ドロップした際のデータ(この場合画像データ)を`QMimeData`オブジェクトに設定し、さらに`QDrag`オブジェクトを作成し`exec`メソッドを呼び出す必要があります。  
(参考: [QtのDrag and Dropの解説](http://doc.qt.io/qt-5/dnd.html))

こんな感じでしょうか。  
(`QLabel`を拡張したクラスの`mousePressEvent`メソッドをオーバーライドするイメージです。また「画像データ」は何かしらの`QPixmap`オブジェクトのイメージです)

[code]

    def mousePressEvent(e):
        mimeData = QMimeData()
        mimeData.setPixmap(画像データ)
        drag = QDrag(self)
        drag.setMimeData(mimeData)
        # これはドラッグ操作中に画像を表示するために設定している
        drag.setPixmap(画像データ)
        drag.exec()
    
[/code]


CC BY-SA 3.0
2017-12-06T09:37:24.817
40088
2017-12-06T09:59:53.717
2017-12-06T09:59:53.717
20098
20098
40065
answer