QListWidget外部拖动而不删除项目?

时间:2016-11-29 21:05:33

标签: python qt drag-and-drop pyqt pyside

版本: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运行它。

0 个答案:

没有答案