PyQt MimeData文件名 [英] PyQt MimeData Filename

查看:538
本文介绍了PyQt MimeData文件名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我本质上重复了一个问题(但没有回答)在

I am essentially repeating a question that was asked (but not answered) in the comments of PyQt: Getting file name for file dropped in app .

我想要做的是一个这个帖子,它是将当前看起来像这样的pyqt中的一个文件丢失事件的输出转换为:
$ code> /。file / id = 6571367.661326 成为实际文件路径(即/.Documents/etc./etc./myProject/fileNeeded.extension )

What I'd like to be able to do, a la that post, is convert an output from a file drop event in pyqt that currently looks like this: /.file/id=6571367.661326 into an actual file path (i.e. /.Documents/etc./etc./myProject/fileNeeded.extension)

,以便我可以利用创建尝试的QDropEvent的文件。如何做到这一点任何想法?

so that I can make use of the file that made the attempted QDropEvent. how to do this. Any thoughts?

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

As mentioned below in the comments, this appears to be a platform specific problem. I am running Mac OS X El Capitan (10.11.2)

推荐答案

我找出了解决方案,翻译了Obj-C代码在 https://bugreports.qt.io/browse/QTBUG-40449 。请注意,此解决方案仅适用于运行OS X Yosemite或更高版本的Mac,而不运行PyQt5(即在我的情况下运行v.4.8)。

I figured out the solution after translating Obj-C code found in https://bugreports.qt.io/browse/QTBUG-40449. Note that this solution is only necessary for Macs running OS X Yosemite or later AND not running PyQt5 (i.e. running v.4.8 in my case).

import objc
import CoreFoundation as CF

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()

看到这个工作在拖放状态离子,见下文:

To see this working in a drag and drop situation, see below:

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_())

这篇关于PyQt MimeData文件名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆