Python PyQt-MimeData文件名

Python PyQt-MimeData文件名,python,drag-and-drop,pyqt,mime-types,Python,Drag And Drop,Pyqt,Mime Types,我基本上是在重复一个问题,这个问题是在他的评论中提出的(但没有得到回答) 我希望能够做的是转换pyqt中文件删除事件的输出,该事件当前如下所示: /.file/id=6571367.661326转换为实际文件路径(即/.Documents/etc./etc./myProject/fileNeeded.extension) 这样我就可以使用创建尝试的QDropEvent的文件。如何做到这一点。有什么想法吗 编辑: 如下文评论中所述,这似乎是一个特定于平台的问题。我正在运行Mac OS X El C

我基本上是在重复一个问题,这个问题是在他的评论中提出的(但没有得到回答)

我希望能够做的是转换pyqt中文件删除事件的输出,该事件当前如下所示:
/.file/id=6571367.661326
转换为实际文件路径(即/.Documents/etc./etc./myProject/fileNeeded.extension)

这样我就可以使用创建尝试的QDropEvent的文件。如何做到这一点。有什么想法吗

编辑:
如下文评论中所述,这似乎是一个特定于平台的问题。我正在运行Mac OS X El Capitan(10.11.2)

在翻译了中的Obj-C代码后,我找到了解决方案。请注意,此解决方案仅适用于运行OS X Yosemite或更高版本且不运行PyQt5(即在我的情况下运行v.4.8)的Mac

要查看此功能在拖放情况下的工作情况,请参见以下内容:

import sys
import objc
import CoreFoundation as CF
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyListWidget(QListWidget):
    def __init__(self, parent):
        super(MyListWidget, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setDragDropMode(QAbstractItemView.InternalMove)

    def getUrlFromLocalFileID(self, localFileID):
        localFileQString = QString(localFileID.toLocalFile())
        relCFStringRef = CF.CFStringCreateWithCString(
            CF.kCFAllocatorDefault,
            localFileQString.toUtf8(),
            CF.kCFStringEncodingUTF8
            )
        relCFURL = CF.CFURLCreateWithFileSystemPath(
            CF.kCFAllocatorDefault,
            relCFStringRef,
            CF.kCFURLPOSIXPathStyle,
            False   # is directory
            )
        absCFURL = CF.CFURLCreateFilePathURL(
            CF.kCFAllocatorDefault,
            relCFURL,
            objc.NULL
            )
        return QUrl(str(absCFURL[0])).toLocalFile()

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
        else:
            super(MyListWidget, self).dragEnterEvent(event)

    def dragMoveEvent(self, event):
        super(MyListWidget, self).dragMoveEvent(event)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                if QString(url.toLocalFile()).startsWith('/.file/id='):
                    url = self.getUrlFromLocalFileID(url)
                    links.append(url)
                else:
                    links.append(str(url.toLocalFile()))
            for link in links:
                self.addItem(link)
        else:
            super(MyListWidget,self).dropEvent(event)

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,300,400)
        self.setWindowTitle("Filenames")

        self.list = MyListWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.list)

        self.setLayout(layout)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyle("plastique")

    window = MyWindow()
    window.show()

    sys.exit(app.exec_())

在翻译了在中找到的Obj-C代码后,我找到了解决方案。请注意,此解决方案仅适用于运行OS X Yosemite或更高版本且不运行PyQt5(即在我的情况下运行v.4.8)的Mac

要查看此功能在拖放情况下的工作情况,请参见以下内容:

import sys
import objc
import CoreFoundation as CF
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyListWidget(QListWidget):
    def __init__(self, parent):
        super(MyListWidget, self).__init__(parent)
        self.setAcceptDrops(True)
        self.setDragDropMode(QAbstractItemView.InternalMove)

    def getUrlFromLocalFileID(self, localFileID):
        localFileQString = QString(localFileID.toLocalFile())
        relCFStringRef = CF.CFStringCreateWithCString(
            CF.kCFAllocatorDefault,
            localFileQString.toUtf8(),
            CF.kCFStringEncodingUTF8
            )
        relCFURL = CF.CFURLCreateWithFileSystemPath(
            CF.kCFAllocatorDefault,
            relCFStringRef,
            CF.kCFURLPOSIXPathStyle,
            False   # is directory
            )
        absCFURL = CF.CFURLCreateFilePathURL(
            CF.kCFAllocatorDefault,
            relCFURL,
            objc.NULL
            )
        return QUrl(str(absCFURL[0])).toLocalFile()

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()
        else:
            super(MyListWidget, self).dragEnterEvent(event)

    def dragMoveEvent(self, event):
        super(MyListWidget, self).dragMoveEvent(event)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            event.setDropAction(Qt.CopyAction)
            event.accept()
            links = []
            for url in event.mimeData().urls():
                if QString(url.toLocalFile()).startsWith('/.file/id='):
                    url = self.getUrlFromLocalFileID(url)
                    links.append(url)
                else:
                    links.append(str(url.toLocalFile()))
            for link in links:
                self.addItem(link)
        else:
            super(MyListWidget,self).dropEvent(event)

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,300,400)
        self.setWindowTitle("Filenames")

        self.list = MyListWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.list)

        self.setLayout(layout)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    app.setStyle("plastique")

    window = MyWindow()
    window.show()

    sys.exit(app.exec_())

我认为您应该指出,问题是特定于平台的。在我的Ubuntu@ekhumoro上,解决方案运行得很好。(未答复)。看起来这个问题已经在Qt-5.4.1中解决了。我想您应该指出,这个问题是特定于平台的。在我的Ubuntu@ekhumoro上,解决方案运行得很好。(未答复)。看起来这个问题已经在Qt-5.4.1中解决了。