【Python】文件拖放(drag and drop)并获取文件信息

QWidget 对象支持拖放,拖拽文件到窗口时触发拖拽事件,拖拽时触发的几个事件函数:

dragEnterEvent:当拖动动作进入窗口时触发该事件

dragLeaveEvent:当拖动动作离开窗口时触发该事件,离开窗口时没有mimeData数据对象

dragMoveEvent:当拖动不放在窗口移动时触发该事件

dropEvent:当拖动文件到窗口松开鼠标的时候触发该事件,窗口外松开不触发,放置时可以根据需要过滤文件类型,拖放后event.mimeData().urls()上则返回一个多个QUrl类型的实体,每一个QUrl中包含了每一个文件的路径,通过toLocalFile()可以获取到QUrl中包含的在当前系统上的全路径格式。

要支持拖放,必须设置当前部件是否支持拖放,方式如下:

setAcceptDrops(True)

acceptDrops()获取当前部件是否支持拖放

示例:

1,使用designer绘制界面,如下:

2,使用Python\Python3.10.2\Scripts\pyside6-uic.exe将ui文件转成py代码文件,配置和生成方式见 【Python】PyCharm配置外部工具

3,支持点击浏览按钮选择文件路径,支持拖拽文件路径放置

4, 完整代码如下,其中mainWindow 模块时pyside6-uic.exe生成的

import os
import sys

import PySide6
from mainWindow import *
from PySide6.QtWidgets import QApplication,QMainWindow,QFileDialog,QWidget
from PySide6 import QtCore

class MainWindos(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.show()
        self.setAcceptDrops(True)
        self.file_path = ''
        self.EventListener()

    def EventListener(self):
        self.ui.pushButton_browse.clicked.connect(self.BrowseFilePath)

    def BrowseFilePath(self):
        print("BrowseFilePath")
        noe_path = os.getcwd()
        choice_file_path = QFileDialog.getOpenFileName(self, "选择文件", noe_path, "Excel files(*.xlsx *.xls)")
        print("choice_file_path", choice_file_path)
        if os.path.exists(choice_file_path[0]):
            self.file_path = choice_file_path[0]
            self.ui.lineEdit_path.setText(self.file_path)

    def dragEnterEvent(self, event:PySide6.QtGui.QDragEnterEvent) -> None:
        # 鼠标按住文件拖到界面窗口时进入该函数,在窗口外拖动不会打印
        # print("dragEnterEvent==>")
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragLeaveEvent(self, event:PySide6.QtGui.QDragEnterEvent):
        print("dragLeaveEvent==>")

    def dragMoveEvent(self, event:PySide6.QtGui.QDragMoveEvent) -> None:
        # 拖动在窗口内移动打印,拖着停住在窗口内不打印
        # print("dragMoveEvent==>")
        if event.mimeData().hasUrls:
            try:
                event.setDropAction(Qt.CopyAction)
                pass
            except Exception as e:
                print(e)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event:PySide6.QtGui.QDropEvent) -> None:
        # 在窗口内松开鼠标时进入,如果鼠标先拖着进窗口,后又拖着离开在松开鼠标,不打印
        print("dropEvent==>")
        if event.mimeData().hasUrls:
            event.setDropAction(Qt.CopyAction)
            event.accept()
            file_path = []
            for url in event.mimeData().urls():
                file_path.append(str(url.toLocalFile()))
            self.file_path = file_path[0]
            self.ui.lineEdit_path.setText(self.file_path)
            print(file_path)
        else:
            event.ignore()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindos()
    sys.exit(app.exec())

拖拽效果:

浏览选择效果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值