Python PyQt在应用程序外部拖放到Windows文件资源管理器?

Python PyQt在应用程序外部拖放到Windows文件资源管理器?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我想通过从QListWidget拖动到OS文件资源管理器(在我的例子中是Windows 10)来创建文件,这可能吗?因此,在下面的小部件中,我希望将列表中的“一”和“二”拖到系统文件资源管理器中的一个文件夹中,以创建两个分别包含文本“一”和“二”的名为“一.txt”和“二.txt”的文件 import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt class DragTest(QtWidg

我想通过从QListWidget拖动到OS文件资源管理器(在我的例子中是Windows 10)来创建文件,这可能吗?因此,在下面的小部件中,我希望将列表中的“一”和“二”拖到系统文件资源管理器中的一个文件夹中,以创建两个分别包含文本“一”和“二”的名为“一.txt”和“二.txt”的文件

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt


class DragTest(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setDragEnabled(True)
        self.addItems(['one', 'two', 'three'])
        self.setSelectionMode(self.MultiSelection)


if __name__ == "__main__":
    app = QtWidgets.QApplication.instance() or QtWidgets.QApplication(sys.argv)

    w = DragTest()
    w.show()

    app.exec_()

您需要实现该方法并将URL添加到QDrag实例

class DragTest(QtWidgets.QListWidget):
    # ...
    def startDrag(self, actions):
        drag = QtGui.QDrag(self)
        indexes = self.selectedIndexes()
        mime = self.model().mimeData(indexes)
        urlList = []
        for index in indexes:
            urlList.append(QtCore.QUrl.fromLocalFile(index.data()))
        mime.setUrls(urlList)
        drag.setMimeData(mime)
        drag.exec_(actions)
请注意,我只是使用了
index.data()
,因为您使用了项目名称的完整路径,但您可能更愿意为完整url设置特定的数据角色,以防您只想显示文件名:

FullPathRole = QtCore.Qt.UserRole + 1

class DragTest(QtWidgets.QListWidget):
    # ...
    def dropEvent(self, e):
        if e.mimeData().hasUrls():
            e.setDropAction(QtCore.Qt.CopyAction)
            e.accept()
            fpath_list = []
            for url in e.mimeData().urls():
                fpath_list.append(str(url.toLocalFile()))

            for fpath in fpath_list:
                print(f'IMPORT {fpath}')
                fileName = QtCore.QFileInfo(fpath).fileName()
                item = QtWidgets.QListWidgetItem(fileName)
                item.setData(FullPathRole, fpath)
                self.addItem(fpath)

    def startDrag(self, actions):
        # ...
            urlList.append(QtCore.QUrl.fromLocalFile(index.data(FullPathRole)))


还要注意的是,如果e.mimeData().hasUrls():检查中缺少括号。

我想我的原始问题不清楚-我不想只是将现有文件从一个位置复制到另一个位置。我希望能够在用户从QListWidget拖放到文件资源管理器时创建文件,并且我希望根据他们拖动的项目设置文件名和内容。我编辑了我的问题,删除了额外的代码,这让事情变得不那么清楚