QListWidget
- 创建一个列表并增删改查 - removeItemWidget 和takeItem的区别
- 常用信号
- 列表排序
- 上下文菜单
- selected 和 Checked的区别
我们在Qtdesigner如果看到QListView ,View 视图是要配合模型一起使用的,一般需要前置配置,我们不去使用,我们使用的是QListWidget。
介绍一个库叫faker 伪造,生成人的名字
from faker import Faker
faker = Faker(locale='zh_CN')
print(faker.name())
这样我们就不用手动输入名字了。
增加元素:
addItem() 添加一个元素,可以添加QListWidgetItem和str
addItems() 添加多个元素,只能添加str的sequence(类比列表)
插入元素:
insertItem(row,元素)添加一个元素,可以添加QListWidgetItem和str
insertItems(row,sequence[str]),添加多个元素,只能添加str的sequence(类比列表)
QListWidgetItem
删除元素:
QListWidget.takeItem(index)
改元素
QListWidget.item(index).setText()
查元素
QListWidget.findItems(“要查找的元素”,标志)
- MatchContains 搜索词包含在项目中
- MatchStartswith 以xx开头
- MatchEndswith 以xx结尾
- MatchCaseSensitive 搜索英文的时候是否区分大小写
- MatchRegularExpression 以正则搜索
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (QWidget, QLineEdit, QApplication,
QHBoxLayout, QPushButton, QListWidget, QVBoxLayout,QListWidgetItem)
from faker import Faker
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.fake = Faker(locale='zh_CN')
self.listWidget = QListWidget()
self.listWidget.addItems([self.fake.name() for _ in range(10)])
#插入一个元素
self.listWidget.insertItems(2,['110','120','110'])
#self.listWidget.removeItemWidget(self.listWidget.item(2)) # 并没有删除
#删除一个元素
self.listWidget.takeItem(2) #这个才是真正删除元素的
#修改一个元素
itemGet = self.listWidget.item(3).setText('911')
# 查找一个元素
result = self.listWidget.findItems('张',Qt.MatchFlag.MatchContains)
for i in result:
print(i.text())
self.mainLayout = QVBoxLayout()
self.mainLayout.addWidget(self.listWidget)
self.setLayout(self.mainLayout)
if __name__ == '__main__':
app = QApplication([])
try:
window = MyWindow()
window.show()
except FileNotFoundError as e:
print(e)
except RuntimeError as e:
print(f"Error loading UI: {e}")
app.exec()
QListWidget常用信号
遍历元素
QListWidget.count 获取到有多少个元素
用for循环遍历一行QListWidget.item(index)获取具体的QListWidgetItem
- currentItemChanged(QListWidgeItem *current,QListWidgetItem *previous)
当元素发生改变的时候
- itemChanged(QListWidgetItem *item) 当元素(选中状态)发生改变
常用的槽
clear() 情况列表内所有的槽
def bind(self):
self.listWidget.currentItemChanged.connect(self.listChange)
def listChange(self,item,previous):
print(f'当前选中的值是{item.text()},上一个值是{previous.text()}')
排序:
self.listWidget.addItems([str(random.randint(0,100)) for _ in range(20)])
# 对列表进行排序
self.listWidget.sortItems(Qt.SortOrder.AscendingOrder)
上下文菜单:
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (QWidget, QApplication,
QListWidget, QVBoxLayout,QListWidgetItem)
from faker import Faker
from PySide6.QtGui import QAction
import random
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.fake = Faker(locale='zh_CN')
self.listWidget = QListWidget()
self.listWidget.addItems([str(random.randint(0,100)) for _ in range(20)])
# 给窗体添加上下文菜单
self.sayHello = QAction('你好') # 右键会有你好这个窗体
self.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
self.addAction(self.sayHello)
self.sayHello.triggered.connect(lambda :print('你好'))
# 给控件添加上下文菜单
self.outputCurrentItem = QAction('输出当前选中的值')
self.listWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
self.listWidget.addAction(self.outputCurrentItem)
self.outputCurrentItem.triggered.connect(self.outPutCurrentItem)
self.deleteCurrent = QAction('删除当前元素')
self.listWidget.addAction(self.deleteCurrent)
self.deleteCurrent.triggered.connect(lambda: self.listWidget.takeItem(self.listWidget.currentRow()))
self.mainLayout = QVBoxLayout()
self.mainLayout.addWidget(self.listWidget)
self.setLayout(self.mainLayout)
def outPutCurrentItem(self):
print(self.listWidget.currentItem().text())
if __name__ == '__main__':
app = QApplication([])
try:
window = MyWindow()
window.show()
except FileNotFoundError as e:
print(e)
except RuntimeError as e:
print(f"Error loading UI: {e}")
app.exec()
selected 与 checked的区别 选中
# 将第一个元素设置为能够选中的元素
self.listWidget.item(0).setCheckState(Qt.CheckState.Unchecked)
self.listWidget.itemChanged.connect(lambda :print('被选中了!'))