我试图通过覆盖dropEvent方法来处理TreeWidget上的drop事件。最终,我需要获取被删除的TreeWidgetItem的句柄。到目前为止,我从事件中获得的关于被删除项目的唯一有用信息是QByteArray,它似乎包含被删除项目的文本,除了它的格式很差,有很多空格和一堆不可打印的字符。
非常感谢任何帮助。
编辑:
这是代码,如所提出的,但我真的没有做任何特别的事情,我实际上只是读取drop事件的mimeData中包含的唯一数据类型。听起来好像我将不得不重写Drag事件?并添加一些类型的标识符,以允许我获得一个回到原始QTreeWidget的句柄??
def dropEvent( self, event ):
data = event.mimeData().data( 'application/x-qabstractitemmodeldatalist' )
print data
答案 0 :(得分:1)
我不太确定我是否正确理解了这个问题,但你的mime数据来自startDrag方法,你创建了一个QMimeData对象,设置了它的类型并相应地提供了数据。在您的dropEvent方法中,检查传入数据的类型并相应地处理它,或者如果您不识别该类型则忽略。
另请查看此处的文档:Drag and Drop它应该让您了解qt中拖放的工作方式
我在这里也做了一个小例子,看看它是否适合你:
import sys
from PyQt4 import QtGui, QtCore
class TestTreeWidget(QtGui.QTreeWidget):
def __init__(self, parent = None):
super(TestTreeWidget, self).__init__(parent)
self.setDragEnabled(True)
self.setAcceptDrops(True)
def startDrag(self, dropAction):
# create mime data object
mime = QtCore.QMimeData()
mime.setData('application/x-item', '???')
# start drag
drag = QtGui.QDrag(self)
drag.setMimeData(mime)
drag.start(QtCore.Qt.CopyAction | QtCore.Qt.CopyAction)
def dragMoveEvent(self, event):
if event.mimeData().hasFormat("application/x-item"):
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
else:
event.ignore()
def dragEnterEvent(self, event):
if (event.mimeData().hasFormat('application/x-item')):
event.accept()
else:
event.ignore()
def dropEvent(self, event):
if (event.mimeData().hasFormat('application/x-item')):
event.acceptProposedAction()
data = QtCore.QString(event.mimeData().data("application/x-item"))
item = QtGui.QTreeWidgetItem(self)
item.setText(0, data)
self.addTopLevelItem(item)
else:
event.ignore()
class MainForm(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.view = TestTreeWidget(self)
self.view.setColumnCount(1)
item0 = QtGui.QTreeWidgetItem(self.view)
item0.setText(0, 'item0')
item1 = QtGui.QTreeWidgetItem(self.view)
item1.setText(0, 'item1')
self.view.addTopLevelItems([item0, item1])
self.setCentralWidget(self.view)
def main():
app = QtGui.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()
if __name__ == '__main__':
main()
您也可以在此处查看类似帖子:QTreeView with drag and drop support in PyQt
希望这有帮助,尊重