|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +""" |
| 5 | +Created on 2018年11月4日 |
| 6 | +@author: Irony |
| 7 | +@site: https://pyqt5.com, https://github.com/892768447 |
| 8 | +@email: 892768447@qq.com |
| 9 | +@file: 删除Item |
| 10 | +@description: |
| 11 | +""" |
| 12 | +from PyQt5.QtCore import QSize, pyqtSignal |
| 13 | +from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QPushButton,\ |
| 14 | + QListWidgetItem, QVBoxLayout, QListWidget |
| 15 | + |
| 16 | + |
| 17 | +__Author__ = """By: Irony |
| 18 | +QQ: 892768447 |
| 19 | +Email: 892768447@qq.com""" |
| 20 | +__Copyright__ = 'Copyright (c) 2018 Irony' |
| 21 | +__Version__ = 1.0 |
| 22 | + |
| 23 | + |
| 24 | +class ItemWidget(QWidget): |
| 25 | + |
| 26 | + itemDeleted = pyqtSignal(QListWidgetItem) |
| 27 | + |
| 28 | + def __init__(self, text, item, *args, **kwargs): |
| 29 | + super(ItemWidget, self).__init__(*args, **kwargs) |
| 30 | + self._item = item # 保留list item的对象引用 |
| 31 | + layout = QHBoxLayout(self) |
| 32 | + layout.setContentsMargins(0, 0, 0, 0) |
| 33 | + layout.addWidget(QLineEdit(text, self)) |
| 34 | + layout.addWidget(QPushButton('x', self, clicked=self.doDeleteItem)) |
| 35 | + |
| 36 | + def doDeleteItem(self): |
| 37 | + self.itemDeleted.emit(self._item) |
| 38 | + |
| 39 | + def sizeHint(self): |
| 40 | + # 决定item的高度 |
| 41 | + return QSize(200, 40) |
| 42 | + |
| 43 | + |
| 44 | +class Window(QWidget): |
| 45 | + |
| 46 | + def __init__(self, *args, **kwargs): |
| 47 | + super(Window, self).__init__(*args, **kwargs) |
| 48 | + layout = QVBoxLayout(self) |
| 49 | + |
| 50 | + # 列表 |
| 51 | + self.listWidget = QListWidget(self) |
| 52 | + layout.addWidget(self.listWidget) |
| 53 | + |
| 54 | + # 清空按钮 |
| 55 | + self.clearBtn = QPushButton('清空', self, clicked=self.doClearItem) |
| 56 | + layout.addWidget(self.clearBtn) |
| 57 | + |
| 58 | + # 添加测试数据 |
| 59 | + self.testData() |
| 60 | + |
| 61 | + def doDeleteItem(self, item): |
| 62 | + # 根据item得到它对应的行数 |
| 63 | + row = self.listWidget.indexFromItem(item).row() |
| 64 | + # 删除item |
| 65 | + item = self.listWidget.takeItem(row) |
| 66 | + # 删除widget |
| 67 | + self.listWidget.removeItemWidget(item) |
| 68 | + del item |
| 69 | + |
| 70 | + def doClearItem(self): |
| 71 | + # 清空所有Item |
| 72 | + for _ in range(self.listWidget.count()): |
| 73 | + # 删除item |
| 74 | + # 一直是0的原因是一直从第一行删,删掉第一行后第二行变成了第一行 |
| 75 | + # 这个和删除list [] 里的数据是一个道理 |
| 76 | + item = self.listWidget.takeItem(0) |
| 77 | + # 删除widget |
| 78 | + self.listWidget.removeItemWidget(item) |
| 79 | + del item |
| 80 | + |
| 81 | + def testData(self): |
| 82 | + # 生成测试数据 |
| 83 | + for i in range(100): |
| 84 | + item = QListWidgetItem(self.listWidget) |
| 85 | + widget = ItemWidget('item: {}'.format(i), item, self.listWidget) |
| 86 | + # 绑定删除信号 |
| 87 | + widget.itemDeleted.connect(self.doDeleteItem) |
| 88 | + self.listWidget.setItemWidget(item, widget) |
| 89 | + |
| 90 | + |
| 91 | +if __name__ == '__main__': |
| 92 | + import sys |
| 93 | + import cgitb |
| 94 | + sys.excepthook = cgitb.enable(1, None, 5, 'text') |
| 95 | + from PyQt5.QtWidgets import QApplication |
| 96 | + app = QApplication(sys.argv) |
| 97 | + w = Window() |
| 98 | + w.show() |
| 99 | + sys.exit(app.exec_()) |
0 commit comments