PySide如何在dropEvent上获取目标

时间:2014-03-16 21:27:07

标签: python drag-and-drop pyside

我尝试用户友好的拖放UI,我可以拖放项目区域(QTreeWidgets)。有些项目根本无法拖动,有些项目可以拖动但只能拖动到某些项目上。

我设法通过在项目上存储拖动True或False变量来设置项目不被拖动,并在输入dragEnterEvent时检查

class SpecialTreeWidget(QtGui.QTreeWidget):

    def __init__(self, parent=None):
        super(SpecialTreeWidget, self).__init__(parent)

    def dragEnterEvent(self, event):
        super(SpecialTreeWidget, self).dragEnterEvent(event)
        mSenderItems = event.source().selectedItems()
        for item in mSenderItems:
            if not item.scriptMenuData["drag"]:
                event.ignore()
                break
        else:
            event.accept()

当我拖动时,如果项目的scriptMenuData [“drag”]设置为False,则会显示无可移动图标。

现在的问题是做同样的事情,但是当我尝试删除某些项目上的项目时。我最初的想法是在同一个班级做这样的事情

def dragMoveEvent(self, event):
        super(SpecialTreeWidget, self).dragMoveEvent(event)
        mTargetItem = event.target()
        if mTargetItem.scriptMenuData["drop"]:
            event.accept()
        else:
            event.ignore()

但是没有event.target(),我找不到任何方法来获取目标,除了dropMimeData方法,但是为了迟到,我想要“你不能放在这里”图标移动到项目,而不是什么时候被删除。

关于如何获得目标的任何建议,是否有办法获得鼠标下的小部件,或者可能还有其他可以使用的事件/方法/信号?

提前致谢。

/ Christian M

2 个答案:

答案 0 :(得分:0)

所以我设法找到一个解决方案,你可以用QTreeWidget.itemAt()来捕捉一个点下的项目 代码看起来像这样

def dragMoveEvent(self, event):
        super(SpecialTreeWidget, self).dragMoveEvent(event)
        mDropItem = self.itemAt(event.pos())
        if mDropItem:
            if mDropItem.scriptMenuData["drop"]:
                event.accept()
            else:
                event.ignore()
        else:
            event.accept()

答案 1 :(得分:0)

在PySide2中,您可以由此获得目标事件。

from PySide2 import QtWidgets
from PySide2 import QtCore

class MyTreeWidget(QtWidgets.QTreeWidget):
def __init__(self, parent=None):
    super(MyTreeWidget, self).__init__(parent)
    self.setAcceptDrops(True)
    self.setDragDropMode(QtWidgets.QAbstractItemView.DropOnly)
    self.setDefaultDropAction(QtCore.Qt.CopyAction)
    self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)


def dropEvent(self, event):
    item = self.itemAt(event.pos())
    print(item.text(0))