我尝试用户友好的拖放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方法,但是为了迟到,我想要“你不能放在这里”图标移动到项目,而不是什么时候被删除。
关于如何获得目标的任何建议,是否有办法获得鼠标下的小部件,或者可能还有其他可以使用的事件/方法/信号?
提前致谢。
/ Christian M
答案 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()
答案 1 :(得分: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))