2017-03-16 60 views
1

我试图创建一个简单的QListWidget接受文本放入它。无法使其工作。另一方面,拖放事件甚至没有被触发,拖动事件也是如此。 任何人都可以指向正确的方向吗?我做错了什么?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数据处理,如下所示:

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

主要区别在于您的CustomLabel继承自QListWidget而不是QLabel。不幸的是,QListWidget继承自QAbstractScrollArea,它是与该滚动区域相关联的视口控件,它将接收各种拖放事件 - 而不是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类重命名为其他内容......但是,当我用您的代码替换CustomLabel类时,App不会启动/无窗口显示。 – 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_())