首页 > 解决方案 > 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_()

标签: pythonpyqtpyqt5

解决方案


您需要实现该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():支票中缺少括号。


推荐阅读