选择列表类控件主要以列表形式为用户提供选择的项目,用户可以从中选择项,本节将对PyQt5中的常用选择列表类控件的使用进行讲解,包括ComboBoxFontComboBoxListWidget等。

1  ComboBox:下拉组合框


ComboBox控件,又称为下拉组合框控件,它主要用于在下拉组合框中显示数据,用户可以从中选择项。

ComboBox控件对应PyQt5中的QComboBox类,该类的常用方法及说明如表所示。

方    法说    明
addItem()添加一个下拉列表项
addItems()从列表中添加下拉选项
currentText()获取选中项的文本
currentIndex()获取选中项的索引
itemText(index)获取索引为index的项的文本
setItemText(index,text)设置索引为index的项的文本
count()获取所有选项的数量
clear()删除所有选项

ComboBox控件常用的信号有两个:activatedcurrentIndexChanged,其中:

  • activated信号在用户选中一个下拉选项时发射;
  • currentIndexChanged信号则在下拉选项的索引发生改变时发射。

实例 在下拉列表中选择职位

在Qt Designer设计器中创建一个窗口,实现通过ComboBox控件选择职位的功能。在窗口中添加两个Label控件和一个ComboBox控件。其中,第一个Label控件用来作为标识,文本设置为职位:;第二个Label控件用来显示ComboBox中选择的职位;ComboBox控件用来作为职位的下拉列表。设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中自定义一个showinfo()方法,用来将ComboBox下拉列表中选择的项显示在Label标签中,代码如下:

def showinfo(self):  
    self.label_2.setText("您选择的职位是:" + self.comboBox.currentText())  # 显示选择的职位

ComboBox设置下拉列表项及信号与槽的关联。代码如下:

# 定义职位列表  
list = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]  
# 将职位列表添加到ComboBox下拉列表中  
self.comboBox.addItems(list)    
# 将ComboBox控件的选项更改信号与自定义槽函数关联  
self.comboBox.currentIndexChanged.connect(self.showinfo)

.py文件添加程序入口,然后运行程序,当在职位列表中选中某个职位时,将会在下方的Label标签中显示选中的职位,效果如图所示。

Pasted image 20250830223733

2  FontComboBox:字体组合框


FontComboBox控件,又称为字体组合框控件,它主要用于在下拉组合框中显示并选择字体,它对应PyQt5中的QFontComboBox类。

FontComboBox控件的使用与ComboBox控件类似,但由于它的主要作用是选择字体,所以在QFontComboBox类中提供了一个setFontFilters()方法,用来设置可以选择的字体,该方法的参数值及说明如下:

  • QFontComboBox.AllFonts:所有字体。
  • QFontComboBox.ScalableFonts:可以自动伸缩的字体。
  • QFontComboBox.NonScalableFonts:不自动伸缩的字体。
  • QFontComboBox.MonospacedFonts:等宽字体。
  • QFontComboBox.ProportionalFonts:比例字体。

实例 动态改变标签的字体

在Qt Designer设计器中创建一个窗口,实现通过FontComboBox动态改变Label标签字体的功能。在窗口中添加一个Label控件和一个FontComboBox控件,其中,Label控件用来显示文本;而FontComboBox控件用来选择字体。设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中自定义一个setfont()方法,用来将选择的字体设置为Label标签的字体,代码如下:

# 自定义槽函数,用来将选择的字体设置为Label标签的字体  
def setfont(self):  
    # 控制台中输出选择的字体  
    print(self.fontComboBox.currentText())    
    # 为Label设置字体  
    self.label.setFont(QtGui.QFont(self.fontComboBox.currentText()))

FontComboBox控件设置要显示的字体及信号与槽的关联。代码如下:

# 设置字体组合框中显示所有字体  
self.fontComboBox.setFontFilters(QtWidgets.QFontComboBox.AllFonts)  
# 当选择的字体改变时,发射currentIndexChanged信号,调用setfont()槽函数  
self.fontComboBox.currentIndexChanged.connect(self.setfont)

.py文件添加程序入口,然后运行程序,在窗口中的字体下拉组合框中选择某个字体时,会在控制台中输出选择的字体。同时,Label标签中的字体也会更改为选择的字体。例如,下图是在字体下拉组合框中分别选择华文琥珀字体和楷体字体时的效果。

  • 选择华文琥珀字体的效果

Pasted image 20250830225327

  • 选择楷体字体的效果

Pasted image 20250830225403

3  ListWidget:列表


PyQt5中提供了两种列表,分别是ListWidgetListView。其中,ListView是基于模型的,它是ListWidget的父类,使用ListView时,首先需要建立模型,然后再保存数据;而ListWidgetListView的升级版本,它已经内置了一个数据存储模型QListWidgetItem,在使用时,不必自己再建立模型,而直接使用addItem()或者addItems()方法即可添加列表项。所以在实际开发时,推荐使用ListWidget控件作为列表。

ListWidget控件对应PyQt5中的QListWidget类,该类的常用方法及说明如表所示。

方    法说    明
addItem()向列表中添加项
addItems()一次向列表中添加多项
insertItem()在指定索引处插入项
setCurrentItem()设置当前选择项
item.setToolTip()设置提示内容
item.isSelected()判断项是否选中
setSelectionMode()设置列表的选择模式,支持以下5种模式:

◆ QAbstractItemView.NoSelection:不能选择

◆ QAbstractItemView.SingleSelection:单选

◆ QAbstractItemView.MultiSelection:多选

◆ QAbstractItemView.ExtendedSelection:正常单选,按下或者     键后,可以多选

◆ QAbstractItemView.ContiguousSelection:与ExtendedSelection类似
setSelectionBehavior()设置选择项的方式,支持以下3种方式:

◆ QAbstractItemView.SelectItems:选中当前项

◆ QAbstractItemView.SelectRows:选中整行

◆ QAbstractItemView.SelectColumns:选中整列
setWordWrap()设置是否自动换行,True表示自动换行;False表示不自动换行
setViewMode()设置显示模式,有以下2种显示模式:

◆ QListView.ListMode:以列表形式显示

◆ QListView.IconMode:以图表形式显示
item.text()获取项的文本
clear()删除所有列表项

ListWidget控件常用的信号有两个:currentItemChangeditemClicked,其中:

  • currentItemChanged信号在列表中的选择项发生改变时发射;
  • itemClicked信号在单击列表中的项时发射。

实例 用列表展示内地电影票房的总排行榜

随着我国文化产业的不断发展和壮大,内地的电影票房也连年高速增长。截止到2020年,我国的年电影票房已经突破642亿元,较去年同期增长5.4%,其中,国产电影总票房411.75亿元,同比增长8.65%,市场占比64.07%,从中可以看出,国产电影在内地票房中的占比变得越来越重要,这其中的一个关键因素是,国产电影的质量有了很大的飞跃。近几年,我们所熟知的《战狼2》《我和我的祖国》《流浪地球》等优质国产电影不断呈现在大荧幕上,而观众也用高票房回馈了这些优秀的国产电影。本实例我们将使用PyQt5中的ListWidget列表展示内地票房总排行榜的前10名,从中可以看到,其中的90%都是国产电影。

打开Qt Designer设计器,新建一个窗口,在窗口中添加一个ListWidget控件,设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中,首先对ListWidget的显示数据及itemClicked信号进行设置,主要代码如下:

# 设置列表中可以多选  
self.listWidget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)  
# 设置选中方式为整行选中  
self.listWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)  
# 设置以列表形式显示数据  
self.listWidget.setViewMode(QtWidgets.QListView.ListMode)  
self.listWidget.setWordWrap(True)  # 设置自动换行  
from collections import OrderedDict  
# 定义有序字典,作为List列表的数据源  
dict = OrderedDict({'第1名': '战狼2,2017年上映,票房56.83亿', '第2名': '哪吒之魔童降世,2019年上映,票房50.12亿',  
                    '第3名': '流浪地球,2019年上映,票房46.86亿',  
                    '第4名': '复仇者联盟:终局之战,2019年上映,票房42.50亿',  
                    '第5名': '红海行动,2018年上映,票房36.51亿', '第6名': '唐人街探案2,2018年上映,票房33.98亿',  
                    '第7名': '美人鱼,2016年上映,票房33.86亿', '第8名': '我和我的祖国,2019年上映,票房31.71亿',  
                    '第9名': '我不是药神,2018年上映,票房31.00亿', '第10名': '中国机长,2019年上映,票房29.13亿'})  
for key, value in dict.items():  # 遍历字典,并分别获取到键值  
    self.item = QtWidgets.QListWidgetItem(self.listWidget)  # 创建列表项  
    self.item.setText(key + ':' + value)  # 设置项文本  
    self.item.setToolTip(value)  # 设置提示文字  
self.listWidget.itemClicked.connect(self.gettext)

Tip: 多学两招 Python中的字典默认是无序的,可以借助collections模块的OrderedDict类来使字典有序。

上面代码中用到了gettext()槽函数,该函数是自定义的一个函数,用来获取列表中选中项的值,并显示在弹出的提示框中,代码如下:

def gettext(self, item):  # 自定义槽函数,获取列表选中项的值  
    if item.isSelected():  # 判断项是否选中  
        from PyQt5.QtWidgets import QMessageBox  
        QMessageBox.information(MainWindow, "提示", "您选择的是:" + item.text(), QMessageBox.Ok)

.py文件添加程序入口,然后运行程序,效果如图所示。

Pasted image 20250830230959

当用户单击列表中的某项时,弹出提示框,提示选择了某一项,例如单击图中的第3项,则弹出如图所示的对话框。

Pasted image 20250830231043