组合框(Combo Box)用于以一定的约束来获得用户的输入;即组合框会弹出一个列表向用户显一些特定的项,并且用户只能从中选取一个可用的选项。一个组合框会占用比List Widget更少的控件。QComboBox类用于显示指示框。不仅仅可以通过一个组合框显示文本,还可以显示位图。这里是QComBox类提供的一些方法:
方法 | 使用 |
---|---|
setItemText() | 设置或改变组合框中选项的文本。 |
removeItem() | 删除组合框中指定的选项。 |
clear() | 删除组合框中所有的选面。 |
currentText() | 返回当前选项的文本,即当前的选中条目。 |
setCurrentText() | 设置组合框的当前索引,即它会在组合框中选择一个期望的选项作为当前选项。 |
count() | 返回组合框中选项的总数。 |
setMaxCount() | 设置组合框中允许条目的最大数。 |
setEditable() | 使组合框可编辑,即用户可以编辑组合框中的选项。 |
addItem() | 向组合框中添加特定内容。 |
itemText() | 返回组合框中指定索引位置处的文本。 |
currentIndex() | 返回组合框中当前选中选项的索引位置。如果组合框为空或没有选中的选项,那么这个方法返回的索引值是-1。 |
下面是QComboBox中产生的信号:
信号 | 描述 |
---|---|
currentIndexChanged() | 当组合框的当前索引改变时就会发出此信号,即用户从组合框中选择新的选项时产生。 |
activated() | 当用户改变索引时产生。 |
highlighted() | 当用户高亮组合框中的一个选项时产生。 |
editTextChanged() | 当可编辑的组合框中的文本改变时产生。 |
为了理解一个特定的组合框的工作原理,让我们创建一个示例。这个示例将通过一个组合框显示一些银行账户类型并将提示用户选择一个他或她想要开通的银行账户的类型。从组合框中选择一个银行账户类型并通过一个Label部件显示在屏幕上。
按下面的步骤新建一个应用程序,它是使用组合框显示一些选项并解释如何从这个组合框中选择一个选项并显示:
新建一个基于Dialog without Buttons模板的应用程序,从Widget框中拖动2个Label部件和一个Combo Box部件放到窗体上。
将第1个Label部件的text属性设置为Select your account type。
删除第2个Label部件的text属性,它的文本是通过代码来设置。
将Combo Box部件的objectName属性设置为comboBoxAccountType。
第2个Label部件将用来显示用户选择的银行账户类型,因此将第2个Label部件的objectName属性设置为labelAccountType。
因为我们想要Combo Box部件显示一些银行账类型,在Combo Box部件上右击并从弹出的上下文菜单中选择Edit Items选项。
一个一个的向Combox Box部件中添加银行账户类型。
将应用保存为demoComboBox.ui。
单击对话框底部的+按钮以向Combo Box部件中添加一个银行账户类型,如下截图所示:
使用QT Designer创建用户界面并保存为.ui文件,这是一个XML文件,需要转换成Python代码。pyuic5工具可以用于将XML文件生成Python代码。生成的demoComboBox.py这个文件可以在本书的源代码中找到。
将demoComboBox.py作为头文件,并将其导入到你想调用用户界面设计的脚本中,你就可以访问这个组合框了。
创建另一个名为callComboBox.pyw并导入demoComboBox.py代码。Python脚本文件callComboBox.pyw中的代码如下所示:
import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoComboBox import *
class MyForm(QDialog):
def __init__(self):
super().__init__()
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.comboBoxAccountType.currentIndexChanged.connect
(self.dispAccountType)
self.show()
def dispAccountType(self):
self.ui.labelAccountType.setText("You have selected
"+self.ui.comboBoxAccountType.itemText(self.ui.
comboBoxAccountType.currentIndex()))
if __name__=="__main__":
app = QApplication(sys.argv)
w = MyForm()
w.show()
sys.exit(app.exec_())
在demoComboBox.py文件中,有一个使用Ui_开头的顶层对象名称创建的类。即对于顶层对象为Dialog,就会创建一个Ui_Dialog类来存储界面部件元素。那个类包含了两个方法,setupUi和retranslateUi。
setupUi方法创建了用于在Qt Designer中定义的用户界面部件。这些部件的属性也都是通过这个方法设置的。这个setupUi方法只有一个参数,那就是应用的顶层部件,即QDialog的一个实例。retranslateUi方法用于转换界面。
在callComboBox.pyw文件中,每当用户从组合框中选择了任意一个选项时,就会产生currentIndexChanged信号,并且这个currentIndexChanged信号与dispAccountType方法相关联,因此,每当组合框中的任一选项被选中时,都会调用这个dispAccountType方法。
在这个dispAccountType方法中,你通过调用QComboBox类的currentIndex方法访问到当前选择的索引数值,并将这个获取到的索引位置传递到QComboBox类的itemText方法中来得到组合框中当前选中的文本。当前选中的组合框中的选项会通过Label部件显示出来。
运行应用程,你将看到一个组合框,它显示了4个银行账户类型:Saving Account,Current Account,Recurring Deposit Account和Fixed Deposit Account,如下截图所示:
从组合框中选择一个银行账户类型,这个选中的银行账户类型将会通过Label部件显示出来,如下截图所示: