簡體   English   中英

PySide如何在dropEvent上獲取目標

[英]PySide how to get a target on dropEvent

我試圖制作一個用戶友好的拖放 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,則會出現。

現在的問題是做同樣的事情,但是當我試圖將一個項目放在某些項目上時 我最初的想法是在同一個 class 中這樣做

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

所以我設法找到一個解決方案,您可以使用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()

在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