Python 如何在PyQt中为QlistWidget提供拖放文件功能以及内部移动选项
我制作了一个QListWidget,它通过拖放方法接受文件。但是一旦我启用了这个特性,那么以前设置的ListWidget的internalMove选项将无法按用户对列表元素进行排序 ``` ``` 上述代码适用于任何文件的拖放操作,并将所有拖放的文件放在名为Python 如何在PyQt中为QlistWidget提供拖放文件功能以及内部移动选项,python,qt,drag-and-drop,pyqt,Python,Qt,Drag And Drop,Pyqt,我制作了一个QListWidget,它通过拖放方法接受文件。但是一旦我启用了这个特性,那么以前设置的ListWidget的internalMove选项将无法按用户对列表元素进行排序 ``` ``` 上述代码适用于任何文件的拖放操作,并将所有拖放的文件放在名为链接的列表中 但是,当我尝试在列表中填充从链接列表中获取的文件名后在内部移动列表项时,我无法在内部移动列表项以对列表中的项进行排序。启用文件拖放功能时如何执行此操作?提前感谢。使用事件。忽略else语句中的: else: print("
链接
的列表中
但是,当我尝试在列表中填充从链接列表中获取的文件名后在内部移动列表项时,我无法在内部移动列表项以对列表中的项进行排序。启用文件拖放功能时如何执行此操作?提前感谢。使用
事件。忽略else
语句中的:
else:
print("ignored");
event.ignore()
因此,即使启用了内部移动行为,当用户尝试执行除拖放文件以外的任何操作时,它也会忽略使内部移动成为可能的所有事件。因此,解决方案是不要忽略该事件,而是在hasUrls()返回false时从已经存在的事件继承。下面是这方面的完整代码解决方案
class draglist(QtGui.QListWidget):
def __init__(self,parent):
super(draglist,self).__init__(parent);
self.setAcceptDrops(True);
self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction() ;
else:
super(draglist,self).dragEnterEvent(event);
def dragMoveEvent(self, event):
super(draglist,self).dragMoveEvent(event);
def dropEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
links=[]
for url in event.mimeData().urls():
links.append(str(url.toLocalFile()))
self.emit(QtCore.SIGNAL("dropped"),links)
else:
super(draglist,self).dropEvent(event);
在捕捉该信号的列表函数中,执行以下操作:-
MainWindow.connect(ui.fileListWidget、QtCore.SIGNAL(“已删除”)、self.handledrop)
这可能与在dropEvent()中使用局部变量有关。此变量的生存期仅在该函数结束之前,并且在以后才能访问链接的值(信号是异步的)。到那时,名单可能会被销毁。我不确定这是否是问题所在,但请尝试用draglist的实例变量替换链接,例如self.links
,该变量在类\uuuu init\uuu()中初始化
class draglist(QtGui.QListWidget):
def __init__(self,parent):
super(draglist,self).__init__(parent);
self.setAcceptDrops(True);
self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
self.setDefaultDropAction(QtCore.Qt.MoveAction)
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction() ;
else:
super(draglist,self).dragEnterEvent(event);
def dragMoveEvent(self, event):
super(draglist,self).dragMoveEvent(event);
def dropEvent(self, event):
if event.mimeData().hasUrls():
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
links=[]
for url in event.mimeData().urls():
links.append(str(url.toLocalFile()))
self.emit(QtCore.SIGNAL("dropped"),links)
else:
super(draglist,self).dropEvent(event);
def handledrop(self,links):
for url in links:
if os.path.exists(url):
item = QtGui.QListWidgetItem(url, ui.fileListWidget)