前言
对于我们自己写的类,在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_())