Python PyQt在应用程序外部拖放到Windows文件资源管理器?
我想通过从QListWidget拖动到OS文件资源管理器(在我的例子中是Windows 10)来创建文件,这可能吗?因此,在下面的小部件中,我希望将列表中的“一”和“二”拖到系统文件资源管理器中的一个文件夹中,以创建两个分别包含文本“一”和“二”的名为“一.txt”和“二.txt”的文件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
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拖放到文件资源管理器时创建文件,并且我希望根据他们拖动的项目设置文件名和内容。我编辑了我的问题,删除了额外的代码,这让事情变得不那么清楚