[英]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.