如何在PyQt拖放中获取被放置的TreeWidgetItem的句柄?
我正在尝试处理一个树形控件(TreeWidget)的拖放事件,方法是重写它的 dropEvent 方法。最终,我需要获取被拖放的树形控件项(TreeWidgetItem)。到目前为止,我从事件中得到的关于被拖放项的唯一有用信息是一个 QByteArray,看起来里面包含了被拖放项的文本,但格式很糟糕,里面有很多空格和一些不可打印的字符。
如果能得到一些帮助,我将非常感激。
补充:
这是代码,按照要求提供的,但我其实并没有做什么特别的事情,我只是读取了拖放事件中 mimeData 里唯一的数据类型。听起来我可能需要重写拖动事件?并添加某种标识符,以便让我能找到原来的 QTreeWidget?
def dropEvent( self, event ):
data = event.mimeData().data( 'application/x-qabstractitemmodeldatalist' )
print data
1 个回答
2
我不太确定我是否理解你的问题,但你的 MIME 数据是从 startDrag 方法来的。在这个方法里,你创建了一个 QMimeData 对象,设置了它的类型,并相应地提供了数据。在你的 dropEvent 方法中,检查一下传入数据的类型,然后根据类型进行处理,如果不认识这个类型就可以忽略它。
另外,你可以看看这里的文档:拖放操作,这应该能让你了解在 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 在 PyQt 中的实现
希望这对你有帮助,祝好!