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

您可以通过不使用图像 mimetypes 和设置缓冲区来简化此过程。如果您使用网址,这将是一种更通用的方法......

自定义 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 回答