2

この質問と非常によく似ていますが、PyQt アプリケーションから OSX ファイル システムに画像をドラッグ アンド ドロップできるようにしたいと考えています。

ただし、次のコードを使用すると、ドロップ位置に何も表示されません。

私はとても近くにいるようです。に変更mimeData.setData(mimeType, byteArray)するとmimeData.setData("text/plain", selectedImagePath)、ドロップ先に「無題のクリッピング」ファイルが表示されるので、少なくともドラッグ アンド ドロップ操作が機能していることを確認できます。

def startDrag(self, event):     

    selectedImagePath = "/sample/specified/file.jpg"


    ## convert to  a bytestream
    #
    mimeData = QtCore.QMimeData()
    image = QtGui.QImage(selectedImagePath)
    extension = os.path.splitext(selectedImagePath)[1].strip(".")
    mimeType = "image/jpeg" if extension in ["jpeg", "jpg"] else "image/png"

    byteArray = QtCore.QByteArray()
    bufferTime = QtCore.QBuffer(byteArray)
    bufferTime.open(QtCore.QIODevice.WriteOnly)
    image.save(bufferTime, extension.upper())

    mimeData.setData(mimeType, selectedImagePath)

    drag = QtGui.QDrag(self)
    drag.setMimeData(mimeData)

    result = drag.start(QtCore.Qt.CopyAction)

    event.accept()  

どこが間違っていますか?

ドロップされたメディアの名前も設定する必要があることを認識しているため、それに関するガイダンスもいただければ幸いです。

4

1 に答える 1

4

画像の MIME タイプを使用せずにバッファを設定することで、このプロセスを大幅に簡素化できます。URL を使用すると、より普遍的なアプローチになります...

カスタム QLabel の例:

class Label(QtGui.QLabel):

    ...

    def mousePressEvent(self, event): 

        event.accept()

        selectedImagePath = "/Users/justin/Downloads/smile.png"

        # a pixmap from the label, or could be a custom
        # one to represent the drag preview 
        pixmap = self.pixmap()

        # make sure the thumbnail isn't too big during the drag
        if pixmap.width() > 320 or pixmap.height() > 640:
                pixmap = pixmap.scaledToWidth(128)

        mimeData = QtCore.QMimeData()
        mimeData.setUrls([QtCore.QUrl(selectedImagePath)])

        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)
        drag.setPixmap(pixmap)
        # center the hotspot image over the mouse click pos
        drag.setHotSpot(QtCore.QPoint(
            pixmap.width() / 2, 
            pixmap.height() / 2))

        dropAction = drag.exec_(QtCore.Qt.CopyAction, QtCore.Qt.CopyAction)

これで、デスクトップは URL を解釈するだけになり、名前付けは自動的に行われます。楽しみ!

于 2012-05-08T23:18:46.570 に答える