PyQt5 QListWidget实现多列表之间item的插入拖拽

本文介绍如何使用PyQt5的QListWidget实现多个列表间的item拖拽功能,包括通过dropEvent获取坐标,利用坐标获取item的index,再进行item的插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_())


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值