ZetCode

PyQt QListWidget

最后修改于 2023 年 8 月 24 日

在本文中,我们将展示如何使用 QListWidget。

访问 Advanced PyQt5 电子书,阅读 PyQt6 教程,或列出所有 PyQt 教程

PyQt QListWidget

QListWidget 提供了一个基于项的列表控件。

addItem 函数在列表末尾添加一个新项。使用 addItems 函数,可以插入多个项。列表中的项数可以通过 count 函数获取。takeItem 函数从列表中移除一个项。

列表中的当前项可以通过 currentItem 找到,并通过 setCurrentItem 进行更改。

PyQt QListWidget 简单示例

在下面的示例中,我们创建一个以 QListWidget 为特色的简单示例。

simple.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QListWidget, QWidget, QMessageBox,
                             QApplication, QVBoxLayout)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout(self)

        listWidget = QListWidget()

        listWidget.addItem("sparrow")
        listWidget.addItem("robin")
        listWidget.addItem("crow")
        listWidget.addItem("raven")
        listWidget.addItem("woodpecker")
        listWidget.addItem("hummingbird")

        listWidget.itemDoubleClicked.connect(self.onClicked)

        vbox.addWidget(listWidget)
        self.setLayout(vbox)

        self.setGeometry(400, 300, 350, 250)
        self.setWindowTitle('QListWidget')
        self.show()

    def onClicked(self, item):

        QMessageBox.information(self, "Info", item.text())


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

我们创建一个 QListWidget,其项为鸟类的名称。通过双击一个项,当前鸟类的名称会显示在消息框中。

listWidget = QListWidget(self)

创建了一个 QListWidget

listWidget.addItem("sparrow") 
listWidget.addItem("robin")
listWidget.addItem("crow")
...

使用 addItem 函数插入新项。

listWidget.itemDoubleClicked.connect(self.onClicked)

我们将 onClicked 函数连接到 itemDoubleClicked 信号。

def onClicked(self, item):

    QMessageBox.information(self, "Info", item.text())

处理函数接收被双击的项,我们从中用 text 函数获取文本。该文本通过 QMessageBox.information 显示在消息框中。

Simple QListWidget example
图:简单的 QListWidget 示例

PyQt QListWidget 清除/计数

clear 函数移除列表中的所有项,count 函数计算所有项的数量。

clear_count.py
#!/usr/bin/python


import sys
from PyQt6.QtWidgets import (QListWidget, QPushButton, QWidget, QHBoxLayout,
                             QMessageBox, QApplication, QVBoxLayout)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout(self)
        hbox = QHBoxLayout()

        self.listWidget = QListWidget(self)

        self.listWidget.addItems(['sparrow', 'robin', 'crow', 'raven',
                                  'woopecker', 'hummingbird'])

        clearBtn = QPushButton('Clear', self)
        clearBtn.clicked.connect(self.onClearClicked)

        countBtn = QPushButton('Count', self)
        countBtn.clicked.connect(self.onCountClicked)

        vbox.addWidget(self.listWidget)
        hbox.addWidget(clearBtn)
        hbox.addWidget(countBtn)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setGeometry(400, 300, 350, 250)
        self.setWindowTitle('QListWidget')
        self.show()

    def onClearClicked(self):

        self.listWidget.clear()

    def onCountClicked(self):

        QMessageBox.information(self, "Info",
                                f'# of birds {self.listWidget.count()}')


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

我们有两个按钮。第一个清除所有项,第二个计算所有项的数量并在消息框中显示该数字。

clearBtn = QPushButton('Clear', self)
clearBtn.clicked.connect(self.onClearClicked)

countBtn = QPushButton('Count', self)
countBtn.clicked.connect(self.onCountClicked)

QListWidget 下方,我们放置了两个按钮。我们添加了两个点击处理程序。

def onClearClicked(self):

    self.listWidget.clear()

onClearClicked 处理程序中,我们使用 clear 移除所有项。

def onCountClicked(self):

    QMessageBox.information(self, "Info", 
        f'# of birds {self.listWidget.count()}')

onCountClicked 处理程序中,我们使用 count 计算项的数量,并在消息框中显示消息。

Counting items in QListWidget
图:在 QListWidget 中计算项数

QListWidget 对项进行排序

sortItems 函数对 QListWidget 中的项进行排序。

sorting.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QCheckBox, QListWidget, QPushButton, QWidget,
                             QHBoxLayout, QApplication, QVBoxLayout)
from PyQt6.QtCore import Qt


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout(self)
        hbox = QHBoxLayout()

        self.listWidget = QListWidget(self)

        self.listWidget.addItems(['sparrow', 'robin', 'crow', 'raven',
                                  'woopecker', 'hummingbird'])

        self.sortOrder = QCheckBox('Ascending', self)

        sortBtn = QPushButton('Sort', self)
        sortBtn.clicked.connect(self.onSorted)

        vbox.addWidget(self.listWidget)
        hbox.addWidget(self.sortOrder)
        hbox.addWidget(sortBtn)
        vbox.addLayout(hbox)

        self.setLayout(vbox)

        self.setGeometry(400, 300, 350, 250)
        self.setWindowTitle('Sorting items')
        self.show()

    def onSorted(self):

        if self.sortOrder.isChecked():
            order = Qt.SortOrder.AscendingOrder
        else:
            order = Qt.SortOrder.DescendingOrder

        self.listWidget.sortItems(order)


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

我们有一个排序按钮。排序顺序通过 QCheckBox 控件选择。

def onSorted(self):

    if self.sortOrder.isChecked():
        order = Qt.SortOrder.AscendingOrder
    else:
        order = Qt.SortOrder.DescendingOrder

    self.listWidget.sortItems(order)

我们使用 isChecked 确定 QCheckBox 的状态,并选择排序顺序;可以是 Qt.SortOrder.AscendingOrderQt.SortOrder.DescendingOrder。然后我们将顺序传递给 sortItems 函数。

QListWidget sorted items
图:QListWidget 排序后的项

在本文中,我们介绍了 PyQt 的 QListWidget

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已经撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PyQt 教程