PyQt5 QListWidget实现多列表之间item的插入拖拽
先上效果图
原理:
1.通过dropEvent事件来获取拖入的坐标pos
2.然后利用itemAt(pos)来通过坐标的方式来获取当前item的index
3.之后使用index.row() 或index.column()来获取整数值int
4.最后使用insertItem(int,item)来插入即可
源码
#-*-coding:utf-8-*-
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DropInList(QListWidget):
task_data_Signal=pyqtSignal(list)
def __init__(self):
super(DropInList,self).__init__()
self.setAcceptDrops(True) #开启接受拖入
self.setDragEnabled(True) #开启拖拽
# self.setDragDropOverwriteMode(False)
self.setSelectionMode(QAbstractItemView.ExtendedSelection) #开启多选
# self.setDefaultDropAction(Qt.MoveAction)
self.itemClicked.connect(self._select_current_index)
def _select_current_index(self,index):
print('_select_current_index:',index)
def dropEvent(self, QDropEvent):
pos=QDropEvent.pos() #获取拖入事件的坐标
current_item=self.itemAt(pos) #获取当前坐标下的item
current_index=self.indexFromItem(current_item) #获取该item的index
current_row=current_index.row() #获取行数
print('current_row:',current_row)
source_Widget=QDropEvent.source() #获取拖入item的父组件
items=source_Widget.selectedItems() #获取所有的拖入item
for i in items:
source_Widget.takeItem(source_Widget.indexFromItem(i).row()) #实时移除来源item
self.insertItem(current_row,i) #插入本listwidget
print('DropInList 有东西拖入')
class MainWidget(QWidget):
def __init__(self):
super(MainWidget,self).__init__()
self.setWindowTitle('检测拖入')
self.main_layout=QHBoxLayout()
self.left_widget=DropInList()
self.right_widget=DropInList()
pre_list=['a','b','c','d','e','f']
self.right_widget.addItems(pre_list)
self.main_layout.addWidget(self.left_widget)
self.main_layout.addWidget(self.right_widget)
self.setLayout(self.main_layout)
if __name__ == '__main__':
app=QApplication(sys.argv)
m=MainWidget()
m.show()
sys.exit(app.exec_())