【发布时间】:2017-05-16 21:21:26
【问题描述】:
我正在尝试向this PyQt5 example 学习一些东西。您可以选择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中调用QDragEnterEvent::acceptProposedAction()。您还应该以与 dragEnterEvent 相同的方式重新实现 dragMoveEvent()
-
@Fabio 非常感谢! :-)
acceptProposedAction()不是必需的 - 添加def dragMoveEvent(self, e)已经修复了它。如果您将评论写为答案,我可以将此问题标记为已解决。
标签: python qt drag-and-drop qt5 pyqt5