python - PyQt将应用程序外部拖放到Windows文件资源管理器中?
问题描述
我想通过从 QListWidget 拖动到操作系统文件资源管理器(在我的情况下为 Windows 10)来创建文件,这可能吗?因此,在下面的小部件中,我想将列表中的“one”和“two”拖到系统文件资源管理器中的文件夹中,以创建两个名为“one.txt”和“two.txt”的文件,其中包含文本“one”和“二”分别
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():
支票中缺少括号。
推荐阅读
- python-3.x - Odoo 11 将附件存储到其他数据库
- amazon-web-services - 在云形成模板中指定 yum 的版本
- grep - 使用 grep 进行 Linux 单词搜索
- redux - 如何使用ngFor以角度获取和显示ngrx存储数据
- python - 此平台上不支持 Pymssql 的轮子
- r - 如何在闪亮的应用程序中将 selectInput 与 actionButton 结合使用
- google-drive-api - 如何从 Google Drive Comments API 获取单元格范围
- selenium - 构建失败 转发新会话时出错 用于设置的虚拟机空池功能 browserName:chrome
- css - 标记前后的后代伪
- sap - 使用 SAP JCO 3.0 时是否需要调用 BAPI_TRANSACTION_ROLLBACK?