PYQT自定义Widget的2种使用方式


前言

对于我们自己写的类,在pyqt中有2种应用方式。
下面是自定义继承自QListWidget一个类DropInList ,保存为:MylistWidget.py

#-*-coding:utf-8-*-
import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class DropInList(QListWidget):
    def __init__(self):
        super(DropInList,self).__init__()
        # 拖拽设置
        self.setAcceptDrops(True)   #开启接受拖入事件
        self.setDragEnabled(True)   #开启拖出功能
        self.setSelectionMode(QAbstractItemView.ExtendedSelection)  #开启多选模式
        self.setDragDropMode(QAbstractItemView.DragDrop)            # 设置拖放
        self.setDefaultDropAction(Qt.CopyAction)

        # 双击可编辑
        self.edited_item = self.currentItem()
        self.close_flag = True
        self.doubleClicked.connect(self.item_double_clicked)  #双击事件
        self.currentItemChanged.connect(self.close_edit)  #结束编辑事件

        #右键菜单
        self.setContextMenuPolicy(Qt.CustomContextMenu)   
        self.customContextMenuRequested.connect(self.custom_right_menu) 

    def dropEvent(self, QDropEvent):
        """拖拽结束以后触发的事件"""
        source_Widget=QDropEvent.source()#获取拖入元素的父组件
        items=source_Widget.selectedItems()
        # print(items)
        for i in items:
            source_Widget.takeItem(source_Widget.indexFromItem(i).row())  #通过实时计算选中的item的索引来删除listItem
            self.addItem(i)

    def item_double_clicked(self, modelindex: QModelIndex) -> None:
        """双击事件"""
        self.close_edit()
        item = self.item(modelindex.row())
        self.edited_item = item
        self.openPersistentEditor(item)
        self.editItem(item)
    
    def close_edit(self, *_) -> None:
        """关闭edit"""
        if self.edited_item and self.isPersistentEditorOpen(self.edited_item):
            self.closePersistentEditor(self.edited_item)

    def custom_right_menu(self, pos):
        menu = QtWidgets.QMenu()
        opt1 = menu.addAction("新增")
        opt2 = menu.addAction("删除")
        opt3 = menu.addAction("排序")
        opt4 = menu.addAction("清空")
        # hitIndex = self.indexAt(pos).column()
        # if hitIndex > -1:  #确保有至少一个项
        # 	#获取item内容
        #     name=self.item(hitIndex).text()
        action = menu.exec_(self.mapToGlobal(pos))

        if action == opt1:
            item = QtWidgets.QListWidgetItem("新增")
            self.addItem(item)
        elif action == opt2:
            for j in range(len(self.selectedIndexes())-1,-1,-1):  #反向删除
                self.takeItem(self.selectedIndexes()[j].row())
        elif action == opt3:
            self.sortItems()
        elif action == opt4:
            self.clear()

一、在主程序中导入模块


from PyQt5.QtWidgets import QApplication,QMainWindow,QAbstractItemView
from Ui_mutlselecet import Ui_MainWindow
from PyQt5 import QtCore,QtWidgets
from PyQt5.QtCore import Qt
import sys
from Ui_自定义类在designer的使用2 import Ui_MainWindow
from MylistWidget import DropInList  #导入模块使用

class Win(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.listWidget = DropInList()  #新建对象
        self.listWidget_2 = DropInList()  #新建对象
        self.horizontalLayout.addWidget(self.listWidget)
        self.horizontalLayout.addWidget(self.listWidget_2)
        item1 = QtWidgets.QListWidgetItem("项目1")
        item2 = QtWidgets.QListWidgetItem("项目2")
        item3 = QtWidgets.QListWidgetItem("项目3")
        item4 = QtWidgets.QListWidgetItem("项目4")
        self.listWidget.addItem(item1)
        self.listWidget.addItem(item2)
        self.listWidget.addItem(item3)
        self.listWidget.addItem(item4)
        
if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)  # 让程序支持高分辨率显示
    app = QApplication(sys.argv)
    w = Win()
    w.show()
    sys.exit(app.exec_())

二、在designer中使用提升

1.UI设计

在designer中新建listwidget,右键-提升为:
在这里插入图片描述正常保存ui并转化为py,

2.主程序引用:

代码如下(示例):


from PyQt5.QtWidgets import QApplication,QMainWindow,QAbstractItemView
from Ui_mutlselecet import Ui_MainWindow
from PyQt5 import QtCore,QtWidgets
from PyQt5.QtCore import Qt
import sys
from Ui_自定义类在designer的使用 import Ui_MainWindow

class Win(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        

if __name__ == '__main__':
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)  # 让程序支持高分辨率显示
    app = QApplication(sys.argv)
    w = Win()
    w.show()
    sys.exit(app.exec_())

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值