如何解决如何使用 QFileSystemModel 和 QListView 在文件夹项中拖放文件项?
我正在创建一个小部件来浏览和管理我的 qt 应用程序中的文件。为了构建它,我在 QFileSystemModel
视图模式下使用了 QListView
和 IconMode
。
它应该允许使用 QListView
将文件(项目)移动到文件夹(其他项目)中。
我的问题是如何实现这一点?
首先,我试图覆盖 supportedDragActions
中的 supportedDropActions
和 ContentFileSystemModel
函数以允许移动和复制操作。此外,我覆盖了 flags
函数以启用拖放。最后,我覆盖 canDropMimeData
和 dropMimeData
以检查它们是否正在运行,但看起来它们没有运行。
第一个问题是,一旦在光标中显示禁止图标(如下图所示),模型就不允许将项目文件放入 QListView
区域。
首先,我必须将模型设置为允许放置文件夹中的项目。之后,我可以实现代码将拖拽的项目传输到文件夹中。
已准备好重现问题的代码:
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 举报,一经查实,本站将立刻删除。