如何在 PyQt/PySide 中获取删除的文件名

Posted

技术标签:

【中文标题】如何在 PyQt/PySide 中获取删除的文件名【英文标题】:How to get dropped file names in PyQt/PySide 【发布时间】:2012-01-24 00:09:18 【问题描述】:

我正在尝试设置一个应用程序,该应用程序将接受放入其中的 havin 文件。所以,我正在寻找一种方法来在它们被放入时提取路径。

现在,我为应用程序的右侧启用了拖放功能,它会接受放入的文本,但我不知道如何处理放入的文件。

我正在使用:

def PTE_dragEnterEvent(self, e):
    if e.mimeData().hasFormat('text/plain'):
        e.accept()
    else:
        e.ignore() 

def PTE_dropEvent(self, e):
    newText = self.ui.fileListPTE.toPlainText() + '\n\n' + e.mimeData().text()
    self.ui.fileListPTE.setPlainText(newText)

稍微修改了Zetcode Drag and Drop tutorial中提供的代码。


我无法完全让 @ekhumoro 回答为我工作,但它给了我更多可以查看的地方,我发现 Drag and drop files into QListWidget 有帮助。

除了 ekhumoro 提出的建议之外,我还需要实现拖动移动事件。我最终使用的样子:

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls:
        event.accept()
    else:
        event.ignore()
        
def dragMoveEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
    else:
        event.ignore()

def dropEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
        
        newText = self.ui.fileListPTE.toPlainText()
        for url in event.mimeData().urls():
            newText += '\n' + str(url.toLocalFile())
        self.ui.fileListPTE.setPlainText(newText)
        self.emit(QtCore.SIGNAL("dropped"))
    else:
        event.ignore()

【问题讨论】:

我认为hasUrls 是一个函数,所以使用它的条件总是评估为True 【参考方案1】:

QMimeData 类具有处理丢弃 url 的方法。下面是一个最小的工作示例:

# from PyQt4.QtGui import QApplication, QLabel
# from PySide2.QtWidgets import QApplication, QLabel
from PyQt5.QtWidgets import QApplication, QLabel

class Window(QLabel):
    def __init__(self):
        super().__init__()
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        print('drag-enter')
        if event.mimeData().hasUrls():
            print('has urls')
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        lines = []
        for url in event.mimeData().urls():
            lines.append('dropped: %r' % url.toLocalFile())
        self.setText('\n'.join(lines))
    
app = QApplication(['Drag & Drop'])
window = Window()
window.setGeometry(50, 100, 400, 300)
window.show()
app.exec_()

更新

关于问题的补充:

一些小部件(与上面使用的QLabel 不同)具有dragMoveEvent 的默认实现,它明确忽略大多数事件。例如,基于QAbstractItemView 的类可能只处理某些类型的内部移动而忽略其他所有内容。在这种情况下,应添加 dragMoveEvent 的重新实现,明确接受需要以不同方式处理的事件:

class MyView(QTableView):
    ...
    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        else:
            super().dragMoveEvent(event)

【讨论】:

所以我注意到,如果我将文件放入并打印 event.mimeData().urls(),它会返回像 /.file/id=6571367.6613263 这样的值,我认为这是某种 OSX 临时文件。想知道,与这种临时标记相反,如何获得正确的文件名或目录?

以上是关于如何在 PyQt/PySide 中获取删除的文件名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt/PySide 中获取 QPalette 的组和角色?

PyQt/PySide(包装的 C/C++ 对象已被删除)

如何在 Qt/PyQt/PySide 中找到当前的 QLocale?

如何创建一个新的窗口按钮 PySide/PyQt?

使用 PyQt/PySide 禁用 QTableWidget 中特定列中的排序箭头

如何使用线程自动关闭 PyQt/PySide 窗口?