PyQt: получение имени файла для файла, сброшенного в приложении - PullRequest
11 голосов
/ 20 декабря 2011

Я пытаюсь настроить приложение, которое будет принимать файлы havin, добавленные в него. Итак, я ищу способ извлечь путь, когда они вставлены.

Сейчас у меня включена функция перетаскивания для правой части приложения, и она будет принимать вставленный текст, но я не знаю, как справиться с добавлением файла.

Я использую:

def PTE_dragEnterEvent(self, e):
    if e.mimeData().hasFormat('text/plain'):
        e.accept()
    else:
        e.ignore() 

def PTE_dropEvent(self, e):
    newText = self.ui.fileListPTE.toPlainText() + '\n\n' + e.mimeData().text()
    self.ui.fileListPTE.setPlainText(newText)

Что немного изменяет код, предоставленный в учебнике Drag and Drop в PyQT4 .


Я не мог заставить @ekhumoro ответить на меня, но это дало мне больше возможностей для поиска, и я нашел PyQT4: Перетащите файлы в QListWidget , что помогло.

В дополнение к предложениям, сделанным ekhumoro, мне нужно было реализовать событие перетаскивания. То, что я наконец использовал, выглядело так:

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls:
        event.accept()
    else:
        event.ignore()

def dragMoveEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()
    else:
        event.ignore()

def dropEvent(self, event):
    if event.mimeData().hasUrls:
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()

        newText = self.ui.fileListPTE.toPlainText()
        for url in event.mimeData().urls():
            newText += '\n' + str(url.toLocalFile())
        self.ui.fileListPTE.setPlainText(newText)
        self.emit(QtCore.SIGNAL("dropped"))
    else:
        event.ignore()

1 Ответ

14 голосов
/ 20 декабря 2011

Класс QMimeData имеет методы для работы с dropped urls:

def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
        event.accept()
    else:
        event.ignore()

def dropEvent(self, event):
    for url in event.mimeData().urls():
        path = url.toLocalFile().toLocal8Bit().data()
        if os.path.isfile(path):
            print path
            # do other stuff with path...
...