PyQt 将外部应用程序拖放到 Windows 文件资源管理器中?
PyQt drag and drop outside app into Windows file explorer?
我想通过从 QListWidget 拖动到 OS 文件浏览器(在我的例子中是 Windows 10)来创建文件,这可能吗?所以在下面的小部件中,我想将列表中的“一个”和“两个”拖到系统文件资源管理器中的一个文件夹中,以创建两个名为“one.txt”和“two.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_()
您需要实现startDrag()
方法并将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)))
另请注意,您在 if e.mimeData().hasUrls():
检查中缺少括号。
我想通过从 QListWidget 拖动到 OS 文件浏览器(在我的例子中是 Windows 10)来创建文件,这可能吗?所以在下面的小部件中,我想将列表中的“一个”和“两个”拖到系统文件资源管理器中的一个文件夹中,以创建两个名为“one.txt”和“two.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_()
您需要实现startDrag()
方法并将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)))
另请注意,您在 if e.mimeData().hasUrls():
检查中缺少括号。