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())
拖拽效果:
浏览选择效果: