4.2.7列表框:QListView 和QListWidget

1. 列表框:QListView

        列表框属于QListView类,用于以列表方式展示数据,它的子类是 QListWidget 。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。它已经建立了一个数据存储模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item)。QListView类中的常用方法如下:

setModel(Model):用来设置View所关联的Model,可以使用list数据类型作为数据源

selectedItem(n):选中Model中的条目n

isSelected():判断Model中的某条目是否被选中

QListView类中的常用信号如下:

clicked:当单击某项时发送

doubleClicked:当双击某项时发送

【例4.8】QlistView列表测试,结果如下:

# 导入PyQt6的QtWidgets模块,其中包含了构建图形用户界面所需的各种控件和布局  
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QListView, QMessageBox

# 导入PyQt6的QtCore模块,这里主要是使用了QStringListModel,它是一个用于存储和管理字符串列表的模型  
from PyQt6.QtCore import QStringListModel

# 导入sys模块,这个模块提供了对Python解释器使用或维护的一些变量的访问,以及与Python解释器强烈交互的功能  
import sys


# 定义一个名为myWidget的类,它继承自QWidget,QWidget是所有用户界面对象的基类
class myWidget(QWidget):

    # 初始化函数,当创建myWidget类的实例时,这个函数会被调用  
    def __init__(self, parent=None):
        # 调用父类QWidget的初始化函数,确保父类中的所有初始化操作都被执行
        super(myWidget, self).__init__(parent)

        # 设置窗口的标题为"QListView测试"  
        self.setWindowTitle("QListView测试")

        # 调整窗口的大小为300x260像素  
        self.resize(300, 260)

        # 创建一个QStringListModel的实例,这个模型用于存储和管理字符串列表  
        listModel = QStringListModel()

        # 创建一个字符串列表,包含四种编程语言的名称  
        self.list = ['C++', 'Java', 'C#', 'Python']

        # 将上面创建的字符串列表设置到listModel中  
        listModel.setStringList(self.list)

        # 创建一个QListView的实例,QListView是一个可以显示字符串列表的控件  
        listView = QListView()

        # 将之前创建的listModel设置为listView的模型,这样listView就可以显示listModel中的数据了  
        listView.setModel(listModel)

        # 当listView中的某个项目被点击时,调用self.clickedFunc函数  
        listView.clicked.connect(self.clickedFunc)

        # 创建一个QVBoxLayout的实例,这是一个垂直布局管理器  
        layout = QVBoxLayout()

        # 将listView添加到布局中  
        layout.addWidget(listView)

        # 将这个布局设置为myWidget的布局,这样myWidget就会按照这个布局来显示其控件  
        self.setLayout(layout)

        # 定义一个名为clickedFunc的方法,这个方法会在listView中的某个项目被点击时被调用

    def clickedFunc(self, Index):
        # 使用QMessageBox来显示一个信息框,标题为"ListView",内容为"选择: "加上被点击的项目的文本
        QMessageBox.information(self, "ListView", "选择:" + self.list[Index.row()])

    # 如果这个脚本是作为主程序运行(而不是被其他脚本导入),则执行以下代码


if __name__ == "__main__":
    # 创建一个QApplication的实例,它是每一个PyQt6应用程序的核心
    app = QApplication(sys.argv)

    # 创建一个myWidget的实例  
    w = myWidget()

    # 显示这个窗口  
    w.show()

    # 进入应用程序的主事件循环,等待用户的操作,直到应用程序关闭  
    sys.exit(app.exec())

这段代码实现了以下功能:

  1. 创建了一个基于PyQt6的图形用户界面(GUI)应用程序。
  2. 在窗口中显示了一个QListView控件,该控件用于显示一个字符串列表(C++JavaC#Python)。
  3. 当用户在QListView中点击一个项目时,程序会弹出一个信息对话框显示被选中的项目。

使用的布局和控件:

  • 布局QVBoxLayout,这是一个垂直布局,它将控件垂直排列。
  • 控件
    • QWidget:基础窗口部件。
    • QListView:一个可以显示项目列表的控件。
    • QMessageBox:用于显示对话框的控件。

关键语句:

  1. self.setWindowTitle("QListView测试"):设置窗口的标题为“QListView测试”。
  2. self.resize(300, 260):设置窗口的大小为300x260像素。
  3. listModel = QStringListModel()创建一个QStringListModel对象,该对象用于管理字符串列表并将其作为数据源提供给QListView
  4. listModel.setStringList(self.list)self.list中的字符串列表设置为listModel的数据源。
  5. listView.setModel(listModel)listModel设置为QListView的数据模型,这样QListView就能显示listModel中的数据了。
  6. listView.clicked.connect(self.clickedFunc)当用户在QListView中点击一个项目时,会触发clicked信号,这个信号连接到self.clickedFunc方法上。
  7. QMessageBox.information(self,"ListView","选择:"+self.list[Index.row()])clickedFunc方法中,当用户点击一个项目时,显示一个信息对话框,显示被选中的项目。Index.row()获取被点击项目的行号,然后使用该行号从self.list中获取对应的字符串。

总的来说,这段代码创建了一个简单的GUI窗口,窗口中包含一个QListView控件,用于显示一个字符串列表。当用户点击列表中的一个项目时,程序会弹出一个对话框显示被选中的项目。

 

升级版:运行程序,在文本框输入“aaa”,单击“增加项”,如图(a)所示;单击“项目排序”, 如图(b)所示;单击“增加项”,如图(c)所示。

import sys  # 导入Python的系统模块,用于处理命令行参数和退出程序

from PyQt6.QtWidgets import *  # 从PyQt6的QtWidgets模块中导入所有类和函数
from PyQt6.QtGui import QStandardItemModel, QStandardItem  # 从PyQt6的QtGui模块中导入QStandardItemModel和QStandardItem类


class myWidget(QWidget):  # 定义一个名为myWidget的类,继承自QWidget

    def __init__(self, parent=None):  # 初始化方法,parent参数用于接收父对象
        super(myWidget, self).__init__(parent)  # 调用父类QWidget的初始化方法

        self.setWindowTitle("QListView测试")  # 设置窗口的标题为"QListView测试"
        self.resize(200, 200)  # 设置窗口的大小为200x200像素

        self.list = ['C++', 'Java', 'C#', 'Python']  # 创建一个列表,包含四种编程语言的名称

        self.mode = QStandardItemModel(4, 1)  # 创建一个4行1列的QStandardItemModel对象

        for i in range(self.mode.rowCount()):  # 遍历模型的每一行
            item = QStandardItem(self.list[i])  # 创建一个QStandardItem对象,并用列表中的元素初始化它
            self.mode.setItem(i, 0, item)  # 将创建的项设置到模型的指定位置

        self.mode.insertRow(4, QStandardItem("数据结构"))  # 在模型的第5行插入一个新的项,内容为"数据结构"

        self.listview = QListView()  # 创建一个QListView对象
        self.listview.setModel(self.mode)  # 将之前创建的模型设置为QListView的数据源

        self.le = QLineEdit()  # 创建一个QLineEdit对象,用于用户输入文本

        self.addPb = QPushButton("增加项", clicked=self.addItem)  # 创建一个QPushButton对象,设置其文本为"增加项",并连接其点击事件到addItem方法
        self.delPb = QPushButton("删除项", clicked=self.delItem)  # 创建一个QPushButton对象,设置其文本为"删除项",并连接其点击事件到delItem方法
        self.sortPb = QPushButton("项目排序",
                                  clicked=self.sortItem)  # 创建一个QPushButton对象,设置其文本为"项目排序",并连接其点击事件到sortItem方法

        hLayout = QHBoxLayout()  # 创建一个水平布局对象
        hLayout.setContentsMargins(0, 0, 0, 0)  # 设置布局的边距为0

        hLayout.addWidget(self.addPb)  # 将增加按钮添加到水平布局中
        hLayout.addWidget(self.delPb)  # 将删除按钮添加到水平布局中
        hLayout.addWidget(self.sortPb)  # 将排序按钮添加到水平布局中

        self.vLayout = QVBoxLayout(self)  # 创建一个垂直布局对象,并将其设置为当前QWidget的布局

        self.vLayout.addWidget(self.listview)  # 将QListView添加到垂直布局中
        self.vLayout.addWidget(self.le)  # 将QLineEdit添加到垂直布局中
        self.vLayout.addLayout(hLayout)  # 将包含按钮的水平布局添加到垂直布局中

    def addItem(self):  # 定义一个方法,用于添加新的项到模型中
        num = self.mode.rowCount()  # 获取当前模型的行数
        s = self.le.text()  # 获取QLineEdit中的文本
        if s != '':  # 如果文本不为空
            self.mode.appendRow(QStandardItem(s))  # 在模型末尾添加一个新的行,并用获取到的文本初始化

    def delItem(self):  # 定义一个方法,用于删除模型中的最后一个项
        num = self.mode.rowCount()  # 获取当前模型的行数
        self.mode.removeRow(num - 1)  # 删除模型中的最后一行

    def sortItem(self):  # 定义一个方法,用于对模型中的项进行排序
        self.mode.sort(0)  # 对模型的第一列进行排序


if __name__ == '__main__':  # 判断当前脚本是否作为主程序运行
    app = QApplication(sys.argv)  # 创建一个QApplication对象,接收命令行参数
    w = myWidget()  # 创建一个myWidget对象
    w.show()  # 显示窗口,使得窗口能够呈现在屏幕上
    sys.exit(app.exec())  # 进入Qt的事件循环,并等待用户交互,最后退出程序

这段代码主要实现了一个简单的窗口应用程序,其中包含一个QListView用于显示一个列表,以及几个按钮和文本框用于与列表进行交互。列表的内容由QStandardItemModel管理,该模型包含了一些编程语言的名称。

以下是代码中使用的布局和控件:

  1. 布局(Layouts)

    • QHBoxLayout: 这是一个水平布局,用于放置增加、删除和排序按钮。
    • QVBoxLayout: 这是一个垂直布局,用于放置QListViewQLineEdit和水平布局(包含按钮)。
  2. 控件(Widgets)

    • QWidget: 所有用户界面对象的基类。
    • QApplication: 管理应用程序级别的资源,如初始化GUI环境。
    • QListView: 一个视图组件,用于显示QStandardItemModel中的数据。
    • QStandardItemModel: 一个提供标准项模型的类,用于存储和管理数据。
    • QStandardItem: 一个标准的数据项,用于QStandardItemModel
    • QLineEdit: 一个单行文本输入框,用户可以在其中输入文本。
    • QPushButton: 一个按钮,用户可以点击它执行某个动作。

关键语句的解释:

  1. self.setWindowTitle("QListView测试"): 设置窗口的标题为"QListView测试"。
  2. self.resize(200,200): 设置窗口的大小为200x200像素。
  3. self.mode = QStandardItemModel(4,1): 创建一个4行1列的QStandardItemModel
  4. item = QStandardItem(self.list[i]): 创建一个QStandardItem,并用列表中的元素初始化它。
  5. self.mode.setItem(i,0,item): QStandardItem设置到模型的指定位置。
  6. self.mode.insertRow(4, QStandardItem("数据结构")): 在模型的第5行插入一个新的QStandardItem,内容为"数据结构"。
  7. self.listview.setModel(self.mode): 将模型设置为QListView的数据源。
  8. self.addPb = QPushButton("增加项",clicked= self.addItem): 创建一个按钮,并将其点击事件连接到addItem函数。
  9. self.delPb = QPushButton("删除项",clicked= self.delItem): 创建一个删除按钮,连接其点击事件到delItem函数。
  10. self.sortPb = QPushButton("项目排序",clicked= self.sortItem): 创建一个排序按钮,连接其点击事件到sortItem函数。
  11. self.vLayout.addWidget(self.listview): QListView添加到垂直布局中。
  12. self.vLayout.addWidget(self.le): QLineEdit添加到垂直布局中。
  13. self.vLayout.addLayout(hLayout): 将包含按钮的水平布局添加到垂直布局中。

addItemdelItem, 和 sortItem 函数分别用于向模型中添加新的项、删除最后一个项和对模型中的项进行排序。这些函数通过按钮的点击事件触发。

整体来说,这段代码的功能是创建一个窗口,窗口中包含一个显示编程语言的列表视图,以及用于添加、删除和排序列表项的按钮。用户可以通过QLineEdit输入新的项,然后点击"增加项"按钮将其添加到列表中;可以点击"删除项"按钮删除最后一个列表项;可以点击"项目排序"按钮对列表项进行排序。

2. 列表框:QListWidet

列表框属于QListWidet 类,是一个基于条目的接口,用于从列表中添加或删除条目。列表中的每个条目都是一个 QListWidgetItem 对象。可以设置为多重选择。它的常用方法如表。

addItem():在列表中添加QListWidgetItem对象或字符串

addItems():添加列表中的每个条目

insertItem():在指定的索引处插入条目

clear():删除列表的内容

setCurrentItem():设置当前所选条目

sortItems():按升序重新排列条目

QListWidget类中的常用信号如下:

currentItemChanged(cItem, pItem):当列表中的条目发生改变时发送 cItem:表示当前选择项 pItem:在此之前的选择项。

currentRowChanged(row):当列表部件中的当前项发生变化时发送 row当前项行号,如果没有当前项,其值为-1

currentTextChanged(text):当列表部件中的当前项发生变化时发送 text为当前项对应文本。

itemChanged(item):文本无论是否真正改变,当项的文本发生改变时发送

itemClicked(item):当部件中的项被鼠标单击时发送

itemDoubleClicked(item):当部件中的项被鼠标双击时发送

itemEntered(item):当部件中的项接收到鼠标光标时发送 设置mouseTracking属性为True发送,否则只有鼠标移动到项时按下按键时才发送。

itemPressed(item):当鼠标在部件中的项上按下时发送

itemSelectionChanged():无论选中项是否改变,当列表中进行了选择操作后发送 

【例4.10】QListWidet列表框测试。将文本框中输入的内容作为列表框的项目。测试如下:

import sys  # 导入sys模块,用于处理Python解释器与脚本之间的交互,例如获取命令行参数。

from PyQt6.QtCore import *  # 从PyQt6的QtCore模块中导入所有类和函数。

from PyQt6.QtGui import *  # 从PyQt6的QtGui模块中导入所有类和函数。

from PyQt6.QtWidgets import *  # 从PyQt6的QtWidgets模块中导入所有类和函数。


class ListWidget(QListWidget):  # 定义一个名为ListWidget的新类,它继承自QListWidget。

    def clicked(self, item):  # 在ListWidget类中定义一个名为clicked的方法,当某个项目被点击时调用。

        QMessageBox.information(self, "ListWidget", "你选择了: " + item.text())  # 弹出一个信息对话框,显示被点击的项目的文本。


if __name__ == '__main__':  # 检查当前脚本是否是作为主程序运行。

    app = QApplication(sys.argv)  # 创建一个QApplication对象,这是PyQt6应用程序的入口点。

    listWidget = ListWidget()  # 创建一个ListWidget对象,这是自定义的QListWidget。

    listWidget.resize(300, 120)  # 调整ListWidget的大小为300x120像素。

    listWidget.addItem("Item 1")  # 向ListWidget中添加一个文本为"Item 1"的项目。

    listWidget.addItem("Item 2")  # 向ListWidget中添加一个文本为"Item 2"的项目。

    listWidget.addItem("Item 3")  # 向ListWidget中添加一个文本为"Item 3"的项目。

    listWidget.addItem("Item 4")  # 向ListWidget中添加一个文本为"Item 4"的项目。

    listWidget.setWindowTitle('QListwidget 例子')  # 设置ListWidget的窗口标题为'QListwidget 例子'。

    listWidget.itemClicked.connect(listWidget.clicked)  # 当ListWidget中的某个项目被点击时,连接其itemClicked信号到自定义的clicked方法。

    listWidget.show()  # 显示ListWidget窗口。

    sys.exit(app.exec())  # 进入Qt应用程序的主循环,等待用户交互。当应用程序结束时,通过sys.exit退出Python解释器。

这段代码主要实现了一个简单的图形用户界面(GUI)应用程序,该应用程序使用QListWidget控件来显示一个列表,并在用户点击列表中的某个项目时弹出一个信息对话框。

使用的布局和控件

  • 布局:这段代码没有显式使用布局管理器。QListWidget自身就负责项目的布局,因此这里不需要额外的布局管理器。

  • 控件

    • QApplication:应用程序的实例,负责初始化和管理Qt应用程序的控制流和主要设置。
    • QListWidget:这是一个列表控件,用于显示一系列的项目。
    • QMessageBox:用于显示标准对话框,这里用于显示信息对话框。

关键语句

  1. listWidget.addItem("Item 1")QListWidget中添加项目。这里添加了四个项目:"Item 1"、"Item 2"、"Item 3"和"Item 4"。

  2. listWidget.setWindowTitle('QListwidget 例子')设置窗口的标题为"QListwidget 例子"。

  3. listWidget.itemClicked.connect(listWidget.clicked)连接QListWidgetitemClicked信号到自定义的clicked槽函数。这意味着每当用户点击列表中的一个项目时,clicked函数就会被调用。

  4. QMessageBox.information(self, "ListWidget", "你选择了: "+item.text())clicked函数中,显示一个信息对话框,告知用户他们选择了哪个项目。这里使用item.text()来获取被点击项目的文本。

  5. sys.exit(app.exec())启动Qt的事件循环,并等待用户交互。当应用程序关闭时,sys.exit确保Python解释器也退出。

总结:这段代码创建了一个简单的窗口,窗口中有一个QListWidget控件,用于显示四个项目。当用户点击其中一个项目时,会弹出一个信息对话框,告诉用户他们选择了哪个项目。这段代码没有使用任何布局管理器,因为QListWidget本身就能管理项目的布局。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐