我有一个QListWidget
允许拖放文件。这是一个非常标准的表格,已经被广泛覆盖。我在下面复制的代码有效。
我遇到的问题是列表小部件中文件条目的顺序。为了说明我的问题,假设用户(通过按住 shift、ctrl 或其他方式)选择了四个按 Windows 文件资源管理器中所述命名1.txt, 2.txt, 3.txt
和排序的文件。4.txt
当用户拖动这四个选定的文件时,我希望它们以相同的顺序附加到列表小部件中。
但是,实际上发生的情况是,列表中的第一个文件取决于在拖放操作开始时碰巧单击了所选组中的哪个文件。假设用户在开始拖动时单击3.txt
:然后列表小部件将填充为3.txt, 4.txt, 1.txt, 2.txt
. 我想通过忽略在拖动操作开始时作为所选组的一部分碰巧单击的任何文件来保留文件在 Windows 文件管理器中的顺序。我进行了广泛的搜索,但没有找到解决方案。
class FileList(QtGui.QListWidget):
enableRun = QtCore.pyqtSignal(bool)
defaultFilePath = QtCore.pyqtSignal(str)
def __init__(self):
super(FileList,self).__init__()
self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setDropIndicatorShown(True)
self.setToolTip('Drag and drop files that you wish to combine')
self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.setAlternatingRowColors(True)
self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.itemDoubleClicked.connect(self.remove)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
else:
super(FileList, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
else:
super(FileList, self).dragMoveEvent(event)
def dropEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.MoveAction)
self.defaultFilePath.emit(str(event.mimeData().urls()[0].toLocalFile()))
for url in event.mimeData().urls():
self.addItem(str(url.toLocalFile()))
else:
super(FileList, self).dropEvent(event)
self.checkCount()
def dragLeaveEvent(self,event):
for item in self.selectedItems():
self.takeItem(self.row(item))
self.checkCount()
def remove(self,item):
self.takeItem(self.row(item))
self.checkCount()
def checkCount(self):
if self.count() >= 2:
self.enableRun.emit(True)
else:
self.enableRun.emit(False)
def clear(self):
super(FileList,self).clear()
self.checkCount()