将文件拖到QtGui.QLineEdit()设置url tex

2024-04-25 05:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pySide Qt绑定在python脚本中制作了一个QtGui.LineEdit()小部件,我希望能够将一个文件从桌面拖到QLineEdit中,以将QLineEdit中的文本设置为文件的路径。我已经做了QLineEdit.setDragEnabled(True)来启用拖放操作,但是我对如何从这里开始进行操作一无所知。有人知道如何做到这一点吗?在


Tags: 文件文本路径脚本true部件qt桌面
3条回答

Erics答案的一个稍微改进的版本(我希望)是一个注入器的简短实现,该注入器能够为现有的objet添加拖放功能。这对我和QtDesigner一起设计有帮助-

from PyQt4.QtGui import QLineEdit

# reference taken from : http://stackoverflow.com/questions/11872141/drag-a-file-into-qtgui-qlineedit-to-set-url-text

class lineEdit_dragFile_injector():
    def __init__(self, lineEdit, auto_inject = True):
        self.lineEdit = lineEdit
        if auto_inject:
            self.inject_dragFile()

    def inject_dragFile( self ):
        self.lineEdit.setDragEnabled(True)
        self.lineEdit.dragEnterEvent = self._dragEnterEvent
        self.lineEdit.dragMoveEvent = self._dragMoveEvent
        self.lineEdit.dropEvent = self._dropEvent

    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.lineEdit.setText(filepath)

将上述内容保存在单独的文件中-(例如_lineEdit.py) 然后按以下方式使用它- #使用示例:

^{pr2}$

使用上面提到的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)

现在,可以在任何行编辑中使用drop处理程序,而无需子类化:

^{pr2}$

通常,对于事件,可以使用QObject.eventFilter以及QObject.installEventFilter拦截事件并处理它们。然而,它似乎不适用于QDrag/QDrop事件(如果我在这一点上错了-其他人请告诉我,因为我已经把我的头发都拔出来了,想办法让它与过滤一起工作)。在

我所知道的最好的方法是,您必须将QLineEdit子类化,并重载dragEnterEvent、dragmovevent和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)

相关问题 更多 >