jon*_*opf 5 python drag-and-drop pyside
我已经QtGui.LineEdit()使用pySide Qt绑定在python脚本中制作了一个小部件,并且希望能够将文件从桌面拖动到QLineEdit中,以将QLineEdit中的文本设置为文件的路径。我已经完成QLineEdit.setDragEnabled(True)了启用拖放操作的操作,但是我迷失了如何从此处开始的机器人。有谁知道如何实现这一目标?
通常,对于事件,您可以使用 QObject.eventFilter 和 QObject.installEventFilter 来拦截事件并处理它们。然而,它似乎不适用于 QDrag/QDrop 事件(如果我在这方面错了 - 其他人请让我知道,因为我已经竭尽全力试图找出让它工作的方法过滤)。
我知道如何做到这一点的最好方法是,您必须子类化 QLineEdit 并重载 DragEnterEvent、dragMoveEvent 和 dropEvent 方法,以检查拖入类中的内容是否有效。就像是:
from PySide.QtGui import QLineEdit
class FileEdit(QLineEdit):
def __init__( self, parent ):
super(FileEdit, self).__init__(parent)
self.setDragEnabled(True)
def dragEnterEvent( self, event ):
data = event.mimeData()
urls = data.urls()
if ( urls and urls[0].scheme() == 'file' ):
event.acceptProposedAction()
def dragMoveEvent( self, event ):
data = event.mimeData()
urls = data.urls()
if ( urls and urls[0].scheme() == 'file' ):
event.acceptProposedAction()
def dropEvent( self, event ):
data = event.mimeData()
urls = data.urls()
if ( urls and urls[0].scheme() == 'file' ):
# for some reason, this doubles up the intro slash
filepath = str(urls[0].path())[1:]
self.setText(filepath)
Run Code Online (Sandbox Code Playgroud)
如上所述,使用eventFilter机制可以正常工作:
from PyQt4.QtCore import QObject, QEvent
class QLineEditDropHandler(QObject):
def eventFilter(self, watched, event):
if event.type() == QEvent.DragEnter:
# we need to accept this event explicitly to be able to receive QDropEvents!
event.accept()
if event.type() == QEvent.Drop:
md = event.mimeData()
if md.hasUrls():
obj.setText(url.toLocalFile())
return True
return super().eventFilter(watched, event)
Run Code Online (Sandbox Code Playgroud)
现在,无需子类即可在任何行编辑中使用放置处理程序:
lineEdit.installEventFilter(QLineEditDropHandler(self))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4078 次 |
| 最近记录: |