具有拖放操作功能的组件

链接:https://pan.baidu.com/s/1k5xM_agOGMfHvhTfZnDXmg 
提取码:88k5

import sys
from PyQt5.QtWidgets import (QApplication,QWidget,QAbstractItemView,QTreeWidgetItem,QListWidget,QTreeWidget,QTableWidget)
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot,Qt,QEvent

from ui_widget import Ui_Widget
class QmyWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui=Ui_Widget()
        self.ui.setupUi(self)

        self.ui.listSource.installEventFilter(self)
        self.ui.listWidget.installEventFilter(self)
        self.ui.treeWidget.installEventFilter(self)
        self.ui.tableWidget.installEventFilter(self)

        self.ui.listSource.setAcceptDrops(True)
        self.ui.listSource.setDragDropMode(QAbstractItemView.DragDrop)
        self.ui.listSource.setDragEnabled(True)
        self.ui.listSource.setDefaultDropAction(Qt.CopyAction)

        self.ui.listWidget.setAcceptDrops(True)
        self.ui.listWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.ui.listWidget.setDragEnabled(True)
        self.ui.listWidget.setDefaultDropAction(Qt.MoveAction)

        self.ui.treeWidget.setAcceptDrops(True)
        self.ui.treeWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.ui.treeWidget.setDragEnabled(True)
        self.ui.treeWidget.setDefaultDropAction(Qt.MoveAction)

        self.ui.tableWidget.setAcceptDrops(True)
        self.ui.tableWidget.setDragDropMode(QAbstractItemView.DragDrop)
        self.ui.tableWidget.setDragEnabled(True)
        self.ui.tableWidget.setDefaultDropAction(Qt.MoveAction)

        self.__itemView=None#用于设置属性的当前组件
        self.on_radioSource_clicked()#调用一次槽函数,初始化界面

    #==============4个radioButton按钮的槽函数===========
    @pyqtSlot()
    def on_radioSource_clicked(self):
        self.__itemView=self.ui.listSource
        self.__refreshToUI()
    @pyqtSlot()
    def on_radioList_clicked(self):
        self.__itemView=self.ui.listWidget
        self.__refreshToUI()
    @pyqtSlot()
    def on_radioTree_clicked(self):
        self.__itemView=self.ui.treeWidget
        self.__refreshToUI()
    @pyqtSlot()
    def on_radioTable_clicked(self):
        self.__itemView=self.ui.tableWidget
        self.__refreshToUI()
    #=============自定义函数==================
    def __refreshToUI(self):
        self.ui.chkBoxAcceptDrops.setChecked(self.__itemView.acceptDrops())
        self.ui.chkBoxDragEnabled.setChecked(self.__itemView.dragEnabled())
        self.ui.comboMode.setCurrentIndex(self.__itemView.dragDropMode())
        index=self.__getDropActionIndex(self.__itemView.defaultDropAction())
        self.ui.comboDefaultAction.setCurrentIndex(index)
    def __getDropActionIndex(self,actionType):
        if actionType==Qt.CopyAction:
            return 0
        elif actionType==Qt.MoveAction:
            return 1
        elif actionType==Qt.LinkAction:
            return 2
        elif actionType==Qt.IgnoreAction:
            return 3
        else:
            return 0
    #=============用于属性设置的4个组件的槽函数===================
    @pyqtSlot(bool)
    def on_chkBoxAcceptDrops_clicked(self,checked):
        self.__itemView.setAcceptDrops(checked)
    @pyqtSlot(bool)
    def on_chkBoxDragEnabled_clicked(self,checked):
        self.__itemView.setDragEnabled(checked)
    @pyqtSlot(int)
    def on_comboMode_currentIndexChanged(self,index):
        mode=(QAbstractItemView.DragDropMode)(index)
        self.__itemView.setDragDropMode(mode)
    @pyqtSlot(int)
    def on_comboDefaultAction_currentIndexChanged(self,index):
        actionType=self.__getDropActionType(index)
        self.__itemView.setDefaultDropAction(actionType)
    def __getDropActionType(self,index):
        if index==0:
            return Qt.CopyAction
        elif index==1:
            return Qt.MoveAction
        elif index==2:
            return Qt.LinkAction
        elif index==3:
            return Qt.IgnoreAction
        else:
            return Qt.CopyAction
    def eventFilter(self,watched,event):
        if(event.type()==QEvent.KeyPress and event.key()==Qt.Key_Delete):
            if(watched==self.ui.listSource):
                self.ui.listSource.takeItem(self.ui.listSource.currentRow())
            elif(watched==self.ui.listWidget):
                self.ui.listWidget.takeItem(self.ui.listWidget.currentRow())
            elif(watched==self.ui.treeWidget):
                curItem=self.ui.treeWidget.currentItem()
                if(curItem.parent()!=None):
                    parItem=curItem.parent()
                    parItem.removeChild(curItem)
                else:
                    index=self.ui.treeWidget.indexOfTopLevelItem(curItem)
                    self.ui.treeWidget.takeTopLevelItem(index)
            elif(watched==self.ui.tableWidget):
                self.ui.tableWidget.takeItem(self.ui.tableWidget.currentRow(),self.ui.tableWidget.currentColumn())
        return super().eventFilter(watched,event)

if __name__=="__main__":
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放
    app=QApplication(sys.argv)
    form=QmyWidget()
    form.show()
    sys.exit(app.exec_())

猜你喜欢

转载自blog.csdn.net/salmonwilliam/article/details/108150635
今日推荐