Bootstrap

PySide6百练成真(11)

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('被选中了!'))
;