PySide如何在dropEvent中获取目标

1 投票
3 回答
1558 浏览
提问于 2025-04-17 22:34

我正在尝试制作一个用户友好的拖放界面,里面有两个区域(QTreeWidgets),可以在这些区域中拖放项目。有些项目根本不能被拖动,而有些项目可以拖动,但只能放到特定的项目上。

我已经成功地通过在项目上存储一个拖动的真或假的变量来设置某些项目不能被拖动,并在进入拖动事件时进行检查,像这样:

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

3 个回答

0

在编程中,我们常常会遇到一些问题,比如代码运行不正常或者出现错误。这时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案,帮助我们更好地理解问题。

有时候,问题的解决方法可能涉及到一些特定的代码或技术细节。比如,可能需要用到某些特定的函数或者库,这些都是为了让我们的代码能够顺利运行。

总之,技术论坛是一个很好的资源,我们可以在这里找到很多有用的信息和建议,帮助我们解决编程中的各种难题。

def dropEvent(self, event):
    destination = self.centralWidget().childAt(event.pos()).objectName()
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))
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()

撰写回答