我试图从这个 PyQt5 示例中学到一些东西。您可以选择QLineEdit
的文本,将其拖放到QPushButton
上以重命名按钮。这效果很好。
但我也想使用 QTreeWidget
作为投放目标。所选文本应该重置标题标签,而不是重命名按钮。所以我调整了代码以适应QTreeWidget
.但是,将文本拖到QTreeWidget
上时,它甚至不显示"放下鼠标光标"。
怎么了?
这是完整的代码,它被简化为基本代码:它显示了QTreeWidget
的问题,同时使用QPushButton
工作正常:
import sys
from PyQt5.QtWidgets import QTreeWidget, QPushButton, QWidget, QLineEdit, QApplication
class Tree(QTreeWidget):
def __init__(self, parent):
super().__init__(parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.setHeaderLabel(e.mimeData().text())
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.setText(e.mimeData().text())
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
edit = QLineEdit('', self)
edit.setDragEnabled(True)
edit.move(30, 65)
tree = Tree(self)
tree.move(190, 65)
button = Button("Button", self)
button.move(30, 120)
self.setWindowTitle('Simple drag & drop')
self.setGeometry(200, 200, 500, 400)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
您应该以与dragEnterEvent()
相同的方式重新实现dragMoveEvent()
。默认实现可以忽略该事件,具体取决于鼠标光标下的项。