【问题标题】:PySide how to get a target on dropEventPySide如何在dropEvent上获取目标
【发布时间】:2014-03-16 21:27:06
【问题描述】:

我试图创建一个用户友好的拖放 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 方法之外,我找不到任何方法来获取目标,但为时已晚,我想要在移动时显示“你不能放在这里”图标物品,而不是掉落时。

关于如何获取目标的任何建议,有没有办法获取鼠标下的小部件,或者我可以使用另一个事件/方法/信号?

提前致谢。

/克里斯蒂安·M

【问题讨论】:

    标签: python drag-and-drop pyside


    【解决方案1】:

    所以我设法找到了一个解决方案,您可以使用 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()
    

    【讨论】:

      【解决方案2】:

      在 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))
      

      【讨论】:

        猜你喜欢
        • 2017-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        相关资源
        最近更新 更多