将文件拖到QtGui.QLineEdit()中以设置url文本

jon*_*opf 5 python drag-and-drop pyside

我已经QtGui.LineEdit()使用pySide Qt绑定在python脚本中制作了一个小部件,并且希望能够将文件从桌面拖动到QLineEdit中,以将QLineEdit中的文本设置为文件的路径。我已经完成QLineEdit.setDragEnabled(True)了启用拖放操作的操作,但是我迷失了如何从此处开始的机器人。有谁知道如何实现这一目标?

Eri*_*ser 7

通常,对于事件,您可以使用 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)


Seb*_*ner 5

如上所述,使用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)