Python pyqt或pyside Qlistview拖放删除项

Python pyqt或pyside Qlistview拖放删除项,python,drag-and-drop,pyqt,pyside,qlistview,Python,Drag And Drop,Pyqt,Pyside,Qlistview,我正在学习Python和Pyside。尤其是Qt很难处理。 我的工具接受拖放文件。并按自然顺序排序。Qlistview由文件名填充。到目前为止,一切正常。 但是我想移动Qlistview项的位置。所以,拖动项目并将其放到其他位置,但listview不会对项目进行任何更改或删除 这是我的密码 class VideolistView (QtWidgets.QListView): def __init__(self, parent): super(VideolistView,

我正在学习Python和Pyside。尤其是Qt很难处理。 我的工具接受拖放文件。并按自然顺序排序。Qlistview由文件名填充。到目前为止,一切正常。 但是我想移动Qlistview项的位置。所以,拖动项目并将其放到其他位置,但listview不会对项目进行任何更改或删除

这是我的密码

class VideolistView (QtWidgets.QListView): def __init__(self, parent): super(VideolistView, self).__init__(parent) self.setObjectName("VideolistView") self.setGeometry(QtCore.QRect(8, 30, 250, 301)) self.setAcceptDrops(True) self.setDragEnabled(True) self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.Fdir=None self.Model = QtGui.QStandardItemModel(self) self.ProxyModel = NaturalProxyModel(self) self.ProxyModel.setSourceModel(self.Model) self.setModel(self.ProxyModel) def dragEnterEvent(self, event): #if event.mimeData().hasUrls(): event.accept() def dragMoveEvent(self, event): #if event.mimeData().hasUrls(): event.accept() def dropEvent(self, event): if event.mimeData().hasUrls(): event.setDropAction(QtCore.Qt.LinkAction) event.accept() for url in event.mimeData().urls(): dropitem = str(url.toLocalFile()) Fname = os.path.split(dropitem) if not self.Fdir : self.Fdir = Fname[0] elif self.Fdir == Fname[0]: if not self.Model.findItems(Fname[1]): listitem = QtGui.QStandardItem(Fname[1]) listitem.setFlags(listitem.flags() & ~QtCore.Qt.ItemIsDropEnabled) self.Model.appendRow(listitem) else : print ("Not Same Folder") self.ProxyModel.setSourceModel(self.Model) self.ProxyModel.sort(0) self.setModel(self.ProxyModel) else: event.setDropAction(QtCore.Qt.MoveAction) event.accept() 类VideolistView(QtWidgets.QListView): 定义初始化(自身,父级): 超级(视频列表视图,自我)。\uuu初始化\uuuu(父级) self.setObjectName(“VideolistView”) self.setGeometry(QtCore.QRect(8,30,250,301)) self.setAcceptDrops(真) self.setDragEnabled(真) self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) self.Fdir=None self.Model=QtGui.QStandardItemModel(self) self.ProxyModel=NaturalProxyModel(self) self.ProxyModel.setSourceModel(self.Model) self.setModel(self.ProxyModel) def dragEnterEvent(自身、事件): #如果event.mimeData().hasURL(): event.accept() def dragMoveEvent(自身,事件): #如果event.mimeData().hasURL(): event.accept() def dropEvent(自身,事件): 如果event.mimeData().hasURL(): event.setDropAction(QtCore.Qt.LinkAction) event.accept() 对于event.mimeData().url()中的url: dropitem=str(url.toLocalFile()) Fname=os.path.split(dropitem) 如果不是自我。Fdir: self.Fdir=Fname[0] elif self.Fdir==Fname[0]: 如果不是self.Model.findItems(Fname[1]): listitem=QtGui.QStandardItem(Fname[1]) setFlags(listitem.flags()&~QtCore.Qt.ItemIsDropEnabled) self.Model.appendRow(listitem) 其他: 打印(“不相同的文件夹”) self.ProxyModel.setSourceModel(self.Model) self.ProxyModel.sort(0) self.setModel(self.ProxyModel) 其他: event.setDropAction(QtCore.Qt.MoveAction) event.accept() 使用
event.setDropAction(QtCore.Qt.MoveAction)
Releasing Item delete own 我将其更改为
event.setDropAction(QtCore.Qt.CopyAction)
。但是拖放根本不会改变任何事情。 我如何才能正常工作拖放项目

参考:

根据ref,我添加了代码listitem.setFlags(listitem.flags()&~QtCore.Qt.ItemisDropabled),但它不起作用。
给我一些建议。谢谢你的阅读

发生的情况是,您已经应用了排序策略,也就是说,每次尝试修改QListView时,它都将被重新排列。当您移动一个项目时,您正在应用自然顺序策略,因此您不会观察到更改。你可以向我们解释什么时候适用法律,什么时候不适用。同样,好的建议,谢谢
是否始终应用订购策略?我想在文件丢失时进行排序,然后停止排序以自由移动项目
我把下面的例子放在这里,假设我们添加了项目并进行了排序,然后在内部移动项目而不是排序,就像您想要的那样。如果您在列表中添加另一个术语,列表将重新排列,以消除项目的移动。@eyllanese在昨天的问题中,我认为这是一个想法。在将其放入QStandarItemModel之前,我会列出项目列表。并按自然顺序进行排序。然后把它放到QstandarditemModel。它不会启用“模型排序”。那么我可以在Qlistview中移动项目吗?这个想法和你的建议一致吗?我将尝试添加到我的问题中。所发生的是,您已经应用了排序策略,也就是说,每次尝试修改QListView时,它都将被重新排列。当您移动一个项目时,您正在应用自然顺序策略,因此您不会观察到更改。你可以向我们解释什么时候适用法律,什么时候不适用。同样,好的建议,谢谢
是否始终应用订购策略?我想在文件丢失时进行排序,然后停止排序以自由移动项目
我把下面的例子放在这里,假设我们添加了项目并进行了排序,然后在内部移动项目而不是排序,就像您想要的那样。如果您在列表中添加另一个术语,列表将重新排列,以消除项目的移动。@eyllanese在昨天的问题中,我认为这是一个想法。在将其放入QStandarItemModel之前,我会列出项目列表。并按自然顺序进行排序。然后把它放到QstandarditemModel。它不会启用“模型排序”。那么我可以在Qlistview中移动项目吗?这个想法和你的建议一致吗?我将试着补充我的问题。