简体   繁体   English

PySide如何在dropEvent上获取目标

[英]PySide how to get a target on dropEvent

I trying to make a user friendly drag and drop UI where I have to areas (QTreeWidgets) where you can drag and drop items.我试图制作一个用户友好的拖放 UI,我必须在其中可以拖放项目的区域(QTreeWidgets)。 Some items can't be dragged at all and some can be dragged but only onto certain items.有些项目根本无法拖动,有些可以拖动但只能拖动到某些项目上。

I have managed to set items to not be dragged by storing a drag True or False variable on item and check when entering the dragEnterEvent like this我已经设法通过在项目上存储一个拖动 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()

When I drag a none movable icon appears if the items has the scriptMenuData["drag"] set to False.当我拖动一个不可移动的图标时,如果项目的 scriptMenuData["drag"] 设置为 False,则会出现。

The problem now is to do the same thing but when I trying to drop an item on certain items .现在的问题是做同样的事情,但是当我试图将一个项目放在某些项目上时 My initial though was to do like this in the same class我最初的想法是在同一个 class 中这样做

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

But there is no event.target() and I can't find any way to get the target except for the dropMimeData method but that's to late, I want the "you can't drop here" icon when moving over the item, not when it's been dropped.但是没有 event.target() 并且除了 dropMimeData 方法之外我找不到任何方法来获取目标但为时已晚,我想要在移动项目时出现“你不能放在这里”图标,而不是当它被丢弃时。

Any suggestions on how to get the target, is there a way to get a widget that is under the mouse maybe or maybe there is another event/method/signal that I can use?关于如何获得目标的任何建议,有没有办法获得鼠标下的小部件,或者可能有另一个我可以使用的事件/方法/信号?

Thanks in advance.提前致谢。

/Christian M /克里斯蒂安·M

So I manage to find a solution, you can catch which item that is under a point with QTreeWidget.itemAt() The code looks like this 所以我设法找到一个解决方案,您可以使用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()

In PySide2 you can get target event by this. 在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))
def dropEvent(self, event):
    destination = self.centralWidget().childAt(event.pos()).objectName()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM