【问题标题】:Why does drag and drop of text from QLineEdit to QPushButton work, but not to QTreeWidget?为什么将文本从 QLineEdit 拖放到 QPushButton 可以工作,但不能到 QTreeWidget?
【发布时间】: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


【解决方案1】:

您应该以与dragEnterEvent() 相同的方式重新实现dragMoveEvent()。 默认实现可以忽略该事件,具体取决于鼠标光标下的项目。

【讨论】:

  • 谢谢 :-) 你的意思是默认实现可能会忽略该事件,因为我应该使用删除 QTreeWidgetItem 而不是 QTreeWidget 本身?因为我一开始就计划好了——但是,QTreeWidgetItem 似乎没有任何像dragEnterEvent() 这样的预先编写的事件。这就是我最初失败的地方。
  • 不确定,但我认为 QTreeWidget 的实现只能管理 QTreeWidgetItems 的拖放,具体取决于项目标志和小部件的 DragDropMode。如果你想管理你的自定义 d&d,你应该像你一样重新实现 QTreeWidget。
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2013-12-12
  • 2018-03-15
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多