我想实现的效果类似于拖动文件到回收站图标,松开后文件移动到回收站的效果
时间: 2024-03-30 20:36:58 浏览: 166
基于jQuery实现拖拽图标到回收站并删除功能
要实现类似于拖动文件到回收站图标后松开后文件移动到回收站的效果,可以使用`QDragEnterEvent`和`QDropEvent`事件来实现拖放操作,并使用`QStandardPaths`类来获取回收站的路径。
以下是一个示例代码:
```python
import os
from PyQt5.QtCore import QFileInfo, Qt, QStandardPaths
from PyQt5.QtGui import QIcon, QDragEnterEvent, QDropEvent
from PyQt5.QtWidgets import QApplication, QFileSystemModel, QMainWindow, QTreeView, QAction, QMessageBox, QAbstractItemView
class RecycleBin(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Recycle Bin")
# 创建文件系统模型
self.model = QFileSystemModel()
self.model.setRootPath(os.path.expanduser('~/.local/share/Trash/files'))
# 创建树形视图
self.tree = QTreeView()
self.tree.setModel(self.model)
self.tree.setRootIndex(self.model.index(os.path.expanduser('~/.local/share/Trash/files')))
self.tree.setSortingEnabled(True)
self.tree.setDragDropMode(QAbstractItemView.InternalMove)
self.tree.setDragEnabled(True)
self.tree.viewport().setAcceptDrops(True)
self.tree.setDropIndicatorShown(True)
# 创建菜单栏
self.menu = self.menuBar().addMenu("操作")
# 创建菜单项
self.restore_action = QAction("还原", self)
self.restore_action.setShortcut("Ctrl+R")
self.restore_action.triggered.connect(self.restore_selected)
self.delete_action = QAction("删除", self)
self.delete_action.setShortcut(Qt.Key_Delete)
self.delete_action.triggered.connect(self.delete_selected)
# 将菜单项添加到菜单栏
self.menu.addAction(self.restore_action)
self.menu.addAction(self.delete_action)
# 将树形视图添加到主窗口
self.setCentralWidget(self.tree)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dropEvent(self, event):
for url in event.mimeData().urls():
path = url.toLocalFile()
if os.path.isfile(path):
os.system("gvfs-trash {}".format(path))
elif os.path.isdir(path):
os.system("gvfs-trash {}".format(path + "/"))
self.model.refresh()
def restore_selected(self):
# 获取当前选中的文件/文件夹
selected = self.tree.selectedIndexes()
if selected:
path = self.model.filePath(selected[0])
# 还原文件/文件夹
if os.path.isfile(path):
os.system("gvfs-trash --restore {}".format(path))
elif os.path.isdir(path):
os.system("gvfs-trash --restore {}".format(path + "/"))
self.model.refresh()
def delete_selected(self):
# 获取当前选中的文件/文件夹
selected = self.tree.selectedIndexes()
if selected:
path = self.model.filePath(selected[0])
# 显示确认删除对话框
choice = QMessageBox.question(self, "确认删除", "你确定要删除吗?", QMessageBox.Yes | QMessageBox.No)
if choice == QMessageBox.Yes:
# 删除文件/文件夹
if os.path.isfile(path):
os.system("gvfs-trash {}".format(path))
elif os.path.isdir(path):
os.system("gvfs-trash {}".format(path + "/"))
self.model.refresh()
if __name__ == "__main__":
app = QApplication([])
window = RecycleBin()
window.show()
app.exec_()
```
在上面的代码中,我们覆盖了`dragEnterEvent`和`dropEvent`方法来实现拖放操作。当用户拖动文件到树形视图时,会触发`dragEnterEvent`方法,我们在该方法中检查输入的mime数据是否包含URLs,并接受拖放操作。当用户在树形视图中松开鼠标时,会触发`dropEvent`方法,我们在该方法中获取拖放的路径,并使用`os.system`函数和`gvfs-trash`命令来删除文件/文件夹。
阅读全文