版本:Qt 4.8.5,PySide 1.2.2,Python 2.7.10,Windows 8.1
我已经将QListWidget
子类化,以便我可以根据需要控制拖放行为。目前它只实现dropEvent()
和mimeData()
,以便项目的内部重新排序强制使用MoveAction
类型,以便拖放的项目文本在删除时存储在mimeData
中外部
class TestList(QtGui.QListWidget):
def __init__(self, parent=None):
super(TestList, self).__init__(parent)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.setDragEnabled(True)
self.viewport().setAcceptDrops(True)
self.setDropIndicatorShown(True)
def dropEvent(self, event):
if event.source() == self:
event.setDropAction(QtCore.Qt.MoveAction)
super(TestList, self).dropEvent(event)
def mimeData(self, items):
mime_data = super(TestList, self).mimeData(items)
mime_data.setText(("\n").join([item.text() for item in items]))
return mime_data
实施后,TestList
可以从其他列表小部件中拖出QListWidgetItems
,并可以重新排序自己的项目。一切都按预期工作,只要每当项目被拖出TestList
并放到外部文本编辑器上时,项目就会被删除。
如何在拖出CopyAction
窗口小部件并将其删除到某个外部应用程序(甚至是同一应用程序中的其他窗口小部件)时,如何防止项目删除(即导致TestList
行为)?请注意,我想在拖动项目时保留MoveAction
行为,以便在TestList
窗口小部件中进行重新排序。
我尝试将defaultDropAction
设置为CopyAction
,但这似乎没有任何效果。并且在其他应用程序中发生丢弃时,没有事件方法可以覆盖。
更新:我注意到当drop的目标是某种类型的文本编辑器时,删除该项似乎主要(仅?)。例子包括Sublime Text 2和PyCharm。这种行为不一致的可能性如何?
我在这里放置了一个示例python脚本:
http://www.jrcooper.com/public/test_list.txt
将文件扩展名更改为.py,然后在命令行中通过Python运行它。