2017-02-23 3 views
3

QT 디자이너를 사용하여 LineEdit 위젯이 포함 된 xml-File을 만들었습니다. 스크립트에서 드래그 드롭을 통해 파일 경로를 방출하려고했습니다. 그것은 작동하지만 세인트. 잘못된 : URL은 두 번 방출과 같은됩니다Qt + pyqt가 삭제 된 URL을 두 번 냈습니다.

/D :/Qtfile : /// D :/Qt는

내가 PyQt event emmitted twice 같은 유사한 주제를 알고는 유래에서 설명합니다. 그러나 나는 나의 대답을 찾을 수 없다. 아마 나는 그것을 놓친다. 왜 두 번? 첫 번째 "file : //"이 사라진 이유는 무엇입니까?

Qt 디자이너를 사용하지 않고 클래스 CustomEditLine (QLineEdit)과 같은 텍스트를 끌어다 놓기위한 하위 클래스를 정의한 경우 ... 주 창에서 QlineEdit의 인스턴스를 만들면 url은 한 번만 내보내집니다 하지만 여전히 "/ D :/Qt"입니다.

from PyQt5 import QtWidgets, uic 
from PyQt5.QtCore import QObject,QEvent 
import sys 

qtCreatorFile=".\\gui\\testdrop.ui" 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class QDropHandler(QObject): 
    def __init__(self, parent=None): 
     super(QDropHandler, self).__init__(parent) 

    def eventFilter(self, obj, event): 
     if event.type() == QEvent.DragEnter: 
      event.accept() 
     if event.type() == QEvent.Drop: 
      md = event.mimeData() 
      if md.hasUrls(): 
       for url in md.urls():     
        obj.setText(url.path()) 
        break 
      event.accept() 
     return False 

class root_App(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     super(root_App, self).__init__() 
     self.setupUi(self) 
     self.lineEdit_1.installEventFilter(QDropHandler(self)) 

if __name__=="__main__": 
    app= QtWidgets.QApplication(sys.argv) 
    window=root_App() 
    window.show() 
    sys.exit(app.exec_()) 

내 UI-XML :

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>Form</class> 
<widget class="QWidget" name="Form"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>758</width> 
    <height>424</height> 
    </rect> 
    </property> 
    <property name="acceptDrops"> 
    <bool>true</bool> 
    </property> 
    <property name="windowTitle"> 
    <string>Form</string> 
    </property> 
    <widget class="QLineEdit" name="lineEdit_1"> 
    <property name="geometry"> 
    <rect> 
    <x>40</x> 
    <y>140</y> 
    <width>691</width> 
    <height>20</height> 
    </rect> 
    </property> 
    </widget> 
</widget> 
<resources/> 
<connections/> 
</ui> 
+0

내가 사용했습니다 qurl :: 경로()와 qurl을() : toLocalFile(). 결과는 같습니다. 그러나 :: host()는 내가 원하는 문자열을 반환합니다 : file : /// D :/Qt. 나는 이해할 수 없다. 왜 path()가 그것을 돌려 준다. –

답변

0

QLineEdit 클래스는 이미 끌어 URL을 드롭 지원 여기 내 코드입니다. 사용자 지정 처리기가 텍스트를 완전히 무시하지 않으므로 텍스트가 두 번 입력되는 이유를 설명합니다. 기본 동작을 완전히 무시하려면 이벤트 필터가 True을 반환해야합니다. 즉,이 이벤트를 처리 했으므로 더 이상 할 일이 없습니다.

귀하의 예제 코드

이 단순화 될 수있다

class root_App(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     super(root_App, self).__init__() 
     self.setupUi(self) 
     self.lineEdit_1.installEventFilter(self) 

    def eventFilter(self, source, event): 
     if (event.type() == QEvent.Drop and 
      source is self.lineEdit_1): 
      md = event.mimeData() 
      if md.hasUrls(): 
       source.setText(md.urls()[0].path()) 
       return True 
     return super(root_App, self).eventFilter(source, event) 
+0

그것은 작동하고, 나는 일반적인 "핸들러"에 지정된 것이 아닌 그것을 적용했다. 감사! 그러나 "path()"는 file : //이없는 URL을 반환합니다. 결과는/D :/xyz입니다. URL에 호스트와 경로가 포함되어 있고 로컬 파일의 "호스트"가 "file : //"이기 때문에? –

+0

코멘트를 잊어 버리십시오 ... 경로는 항상 RFC2396에 따라 슬래시로 시작합니다. –