微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 QFileSystemModel 和 QListView 在文件夹项中拖放文件项?

如何解决如何使用 QFileSystemModel 和 QListView 在文件夹项中拖放文件项?

我正在创建一个小部件来浏览和管理我的 qt 应用程序中的文件。为了构建它,我在 QFileSystemModel 视图模式下使用了 QListViewIconMode

它应该允许使用 QListView文件(项目)移动到文件夹(其他项目)中。

我的问题是如何实现这一点?

首先,我试图覆盖 supportedDragActions 中的 supportedDropActionsContentFileSystemModel 函数以允许移动和复制操作。此外,我覆盖了 flags 函数以启用拖放。最后,我覆盖 canDropMimeDatadropMimeData 以检查它们是否正在运行,但看起来它们没有运行。

一个问题是,一旦在光标中显示禁止图标(如下图所示),模型就不允许将项目文件放入 QListView 区域。

首先,我必须将模型设置为允许放置文件夹中的项目。之后,我可以实现代码将拖拽的项目传输到文件夹中。

enter image description here

已准备好重现问题的代码

import sys
import os

from pyside2.QtWidgets import *
from pyside2.QtGui import *
from pyside2.QtCore import *


class ContentFileSystemModel(QFileSystemModel):

    def __init__(self):
        super(ContentFileSystemModel,self).__init__()

    def supportedDragActions(self) -> Qt.DropActions:
        print("supportedDragActions")
        return Qt.MoveAction | super(ContentFileSystemModel,self).supportedDragActions() | Qt.copyAction

    def supportedDropActions(self) -> Qt.DropActions:
        print("supportedDropActions")
        return Qt.MoveAction | super(ContentFileSystemModel,self).supportedDropActions() | Qt.copyAction

    def flags(self,index: QModelIndex) -> Qt.ItemFlags:
        defaultFlags = super(ContentFileSystemModel,self).flags(index)
        if not index.isValid():
            return defaultFlags
        fileInfo = self.fileInfo(index)
        # The target
        if fileInfo.isDir():
            # Allowed drop
            return Qt.ItemIsDropEnabled | Qt.ItemIsDragEnabled | defaultFlags
        # The source: should be directory( in that case)
        elif fileInfo.isFile():
            # Allowed drag
            return Qt.ItemIsDropEnabled | Qt.ItemIsDragEnabled | defaultFlags
        return defaultFlags

    def canDropMimeData(self,data: QMimeData,action: Qt.DropAction,row: int,column: int,parent: QModelIndex) -> bool:
        print("canDropMimeData")
        return True

    def dropMimeData(self,parent: QModelIndex) -> bool:
        print("dropMimeData")
        return True


def main(argv):
    app = QApplication(sys.argv)

    path = "C:\\Users\\Me\\Desktop"
    file_system_model = ContentFileSystemModel()
    file_system_model.setRootPath(path)
    file_system_model.setReadOnly(False)

    lv_file_manager = QListView()
    lv_file_manager.setModel(file_system_model)
    lv_file_manager.setviewmode(QListView.IconMode)
    lv_file_manager.setRootIndex(file_system_model.index(path))
    lv_file_manager.setResizeMode(QListView.Adjust)

    lv_file_manager.setMovement(QListView.Static)
    lv_file_manager.setSelectionMode(QAbstractItemView.ExtendedSelection)
    lv_file_manager.setWrapping(True)
    lv_file_manager.setAcceptDrops(True)
    lv_file_manager.setDragEnabled(True)
    lv_file_manager.setDropIndicatorShown(True)
    lv_file_manager.setUniformItemSizes(True)
    lv_file_manager.setDragDropMode(QAbstractItemView.InternalMove)
    lv_file_manager.setFlow(QListView.LeftToRight)

    lv_file_manager.show()
    app.exec_()


if __name__ == "__main__":
    main(sys.argv)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。