2017-03-16 12 views
1

텍스트를 입력 할 수있는 간단한 QListWidget을 만들려고했습니다. 작동하도록 만들 수 없습니다. drop-event는 트리거되지 않고, drag 이벤트는 다른 한편으로는 트리거됩니다. 아무도 올바른 방향으로 나를 가리킬 수 있습니까? 나는 무엇을 잘못 했는가?Python PyQt5 : QListWidget이 방울을 허용하지 않습니다.

미리 감사드립니다.

import sys 
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel, QListWidget 
from PyQt5.QtGui import QIcon 
from PyQt5.QtCore import pyqtSlot 

class App(QWidget): 

    def __init__(self): 
     super().__init__() 
     self.title = 'PyQt5 drag and drop' 
     self.left = 500 
     self.top = 400 
     self.width = 400 
     self.height = 250 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     editBox = QLineEdit('Drag this', self) 
     editBox.setDragEnabled(True) 
     editBox.move(10, 10) 
     editBox.resize(100,32) 

     listwidget = CustomLabel(self) 
     listwidget.move(130,15) 

     self.show() 


class CustomLabel(QListWidget): 

    def __init__(self, parent): 
     super().__init__(parent) 
     self.setAcceptDrops(True) 

    def dragEnterEvent(self, e): 
     if e.mimeData().hasFormat('text/plain'): 
      print("dragged") 
      e.accept() 
     else: 
      e.ignore() 


    def dropEvent(self, e): 
     print("dropped") 

     self.addItem(event.mimeData().text()) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ex = App() 
    sys.exit(app.exec_()) 
+0

어쨌든 드래그를 시작해야합니다. [드래그 앤 드롭 문서] (http://doc.qt.io/qt-5/dnd.html)를보십시오. –

+0

해달라고 ... 미안합니다 – Arwed

+0

그게 단지 특정 위젯에게 * 수락 * 상품을 알리는 것입니다 - 실제로 드래그 작업을 시작하는 것과 아무런 관련이 없습니다. 내 첫 코멘트에 링크 된 문서를 읽으십시오. –

답변

1

기본적으로 QListWidget은 삭제 된 텍스트를 처리하지 않으므로 다음과 같이 mime-data 처리를 다시 구현해야합니다.

class CustomLabel(QListWidget):  
    def __init__(self, parent): 
     super().__init__(parent) 
     self.setAcceptDrops(True) 

    def mimeTypes(self): 
     mimetypes = super().mimeTypes() 
     mimetypes.append('text/plain') 
     return mimetypes 

    def dropMimeData(self, index, data, action): 
     if data.hasText(): 
      self.addItem(data.text()) 
      return True 
     else: 
      return super().dropMimeData(index, data, action) 
0

코드가 this example 인 것으로 보입니다.

가장 큰 차이점은 CustomLabelQLabel이 아닌 QListWidget에서 상속된다는 것입니다. 유감스럽게도 QListWidgetQAbstractScrollArea에서 상속되며 해당 스크롤 영역과 연결된 뷰포트 위젯으로 QListWidget 자체가 아닌 다양한 드래그/드롭 이벤트를받습니다.

가장 좋은 방법은 .... 뷰포트에 이벤트 필터를 설치할 수 있습니다

class CustomLabel(QListWidget): 
    def __init__(self, parent): 
     super().__init__(parent) 
     self.setAcceptDrops(True) 

     # Install the event filter. 
     self.viewport().installEventFilter(self) 

    def dragEnterEvent(self, e): 
     if e.mimeData().hasFormat('text/plain'): 
      print("dragged") 
      e.accept() 
     else: 
      e.ignore() 

    def eventFilter (self, obj, event): 
     if obj == self.viewport(): 
      print("event") 
      if event.type() == QEvent.DragMove: 
       print("moved") 
       event.accept() 

       # Your drag enter event processing code goes here 
       return True 
      if event.type() == QEvent.Drop: 
       print("dropped") 
       event.accept() 

       # Your drop event processing code goes here 
       return True 
     return super(CustomLabel, self).eventFilter(obj, event) 

편집 1 : 당신은 아마도 추가해야합니다

...

from PyQt5.QtCore import QEvent 
+0

당신이 맞습니다, 그것의 약간 수정 된 버전입니다. CustomLabel 클래스의 이름을 다른 것으로 변경하는 것을 잊어 버렸습니다. 그러나 AppLont 시작/코드가있는 CustomLabel 클래스를 바꿀 때 표시되는 창이 표시되지 않습니다. – Arwed

+0

** 수정 1 **을 참조하십시오. –

0

놀라운. 이제는 효과가 있습니다. 도움을 많이 주셔서 감사합니다. 그러면 전체 코드가 함께 정리됩니다.

import sys 
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QListWidget 


class App(QWidget): 

    def __init__(self): 
     super().__init__() 
     self.title = 'PyQt5 drag and drop' 
     self.left = 500 
     self.top = 400 
     self.width = 400 
     self.height = 250 
     self.initUI() 

    def initUI(self): 
     self.setWindowTitle(self.title) 
     self.setGeometry(self.left, self.top, self.width, self.height) 

     editBox = QLineEdit('Drag this', self) 
     editBox.setDragEnabled(True) 
     editBox.move(10, 10) 
     editBox.resize(100,32) 

     listwidget = CustomList(self) 
     listwidget.move(130,15) 

     self.show() 


class CustomList(QListWidget): 

    def __init__(self, parent): 
     super().__init__(parent) 
     self.setAcceptDrops(True) 

    def mimeTypes(self): 
     mimetypes = super().mimeTypes() 
     mimetypes.append('text/plain') 
     return mimetypes 

    def dropMimeData(self, index, data, action): 
     if data.hasText(): 
      self.addItem(data.text()) 
      return True 
     else: 
      return super().dropMimeData(index, data, action) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    ex = App() 
    sys.exit(app.exec_())