下拉列表框控件QComBox
下拉列表框控件提供一个下拉式选项列表供用户选择,它可以最大限度地减少所占窗口的面积。
下拉列表框控件的类是 QComboBox,它继承自QWidget。下拉列表框由多行内容构成,下拉列表框控件可以看成是一个 QLineEdit 和一个列表控件的组合体,每行除有必要的文字外,还可以设置图标。
下拉列表中的内容可以是程序运行前就确定的内容,也可以是用户临时添加的内容。当单击下拉列表框时,下拉列表框呈展开状态,显示多行选项供用户选择,根据用户选择的内容发送信号,进行不同的动作。
通常下拉列表框处于折叠状态,只显示一行当前内容。
QComboBox 除了显示可见的文字和图标外,还可以给每行设置一个关联数据,数据类型任意,可以是字符串、文字、图片、类的实例等.通过客户选择的内容,可以读取关联的数据。
可以采用下列方式创建QComboBox类的实例对象其中parent是继承自QWidget的窗口或容器控件
from PySide6.QtWidgets import QComboBox
QComboBox(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
下拉列表框控件QComboBox的常用方法
QComboBox由一列多行内容构成每行称为一个项(item)。
QComboBox的方法主要是有关项的方法,可以添加项、插入项和移除项。如果用Qt Designer 设计界面,则双击QComboBox控件,可以为QComboBox添加项。
下拉列表框控件QComboBox的常用方法如表所示,主要方法介绍如下。
-
在QComboBox控件中添加项的方法有
- addItem(str[,userData=None])
- addItem(QIcon;str[,userData=None])
- addItems(Sequence[str])
前两种只能逐个增加,最后一种可以把一个元素是字符串的迭代序列(列表、元组)加人到 QComboBox中。前两种在增加项时,可以为项关联任何类型的数据。
-
在QComboBox控件中插人项的方法有
- insertItem(index:int,str[;userData=None])
- insertItem(index: int,QIcon,str[,userData=None])
- insertItems(index;int,Sequence[str])。
当插人项时,用setInsertPolicy(QComboBox.InsertPolicy)方法可以设置插入项的位置其中QComboBoxInsertPolicy 的取值如表2所示:
QComboBox.InsertPolicy的取值 说明 QComboBox.NoInsert 不允许插人项 QComboBox.InsertAtTop 在顶部插人项 QComboBox.InsertAtCurrent 在当前位置插入项 QComboBox.InsertAtbottom 在底部插人项 QComboBox.InsertAfterCurrent 在当前项之后插入 QComboBox.InsertBeforeCurrent 在当前项之前插入 QComboBox.InsertAlphabetically 根据字母顺序插人项 -
移除
- 用removeItem(index:int)方法可以从列表中移除指定索引值的项;
- 用clear()方法可以清除所有的项;
- 用clearEditText()方法可以清除显示的内容,而不影响项
-
项编辑和获取
-
通过设置 setEditable(True),即QComboBox 是可编辑状态,可以输人文本,按Enter键后文本将作为项插入列表中在添加和插入项时,可以定义关联的数据
-
另外也可以用setItemData(index:int,any[,role=QtUserRole])方法为索引号是int 的项追加关联的数据,数据类型任意。
-
可以为项定义多个关联数据,第1个数据的角色值 role=QtUserRole(Q.UserRole 的值为256),当追加第2个关联的数据时取role=Qt.UserRole+1,追加第3个关联的数据时取role=QtUserRole+2依次类推
-
用currentData(role=QtUserRole+i)或itemData(index:int,role=Qt.UserRole十i)方法获取关联的数据,其中role=QtUserRole+i表示第i个关联数据的索引,i=0,1,2,
-
-
宽高调整策略
- 利用setSizeAdjustPolicy(QComboBox,SizeAdjustPolicy)方法可以设置QComboBox的宽度和高度根据项的文字的长度进行调整,其中 QComboBox.SizeAdjustPolicy可以取 :
- QComboBox.AdjustToContents(根据内容调整)
- QComboBox.AdjustToContentsOnFirstShow(根据第1次显示的内容调整)
- QComboBox.AdjustToMinimumContentsLengthWithIcon(根据最小长度调整)
- 利用setSizeAdjustPolicy(QComboBox,SizeAdjustPolicy)方法可以设置QComboBox的宽度和高度根据项的文字的长度进行调整,其中 QComboBox.SizeAdjustPolicy可以取 :
QComboBox的方法及参数类型 | 说明 |
---|---|
addItem(str,userData=None) | 添加项,并可设置关联的任意类型的数据 |
addItem(QIcon,str,userData=None) | 添加带图标的项 |
addItems(Sequence[str]) | 用列表、元组等序列添加多个项 |
insertItem(index:int,str,userData=None) | 在索引处插入项 |
insertItem(index; int,QIcon,str,userData=None) | 在索引处插入带图标的项 |
insertItems(index: int,Sequence[str]) | 在索引处插人多个项 |
renoveItem(index:int) | 根据索引值移除项 |
count() | 返回项的数量 |
currentIndex() | 返回当前项的索引 |
currentText() | 返回当前项的文本 |
[slot]setCurrentText(str) | 设置当前显示的文本 |
[slot]setCurrentIndex(index:int) | 根据索引设置为当前项 |
[slot]setEditText(str) | 设置编辑文本 |
setEditable(bool) | 设置是否可编辑 |
setIconSize(QSize) | 设置图标的尺寸 |
set1nsertPolicy(QComboBox.InsertPolicy) | 设置插入项的策略 |
setltemData(index: int,any[.role=Qt.UserRole]) | 根据索引设置关联数据 |
setItemIcon(index: int.QIcon) | 根据索引设置图标 |
setltemText(index: int.str) | 根据索引设置文本 |
setMaxCount(int) | 设置项的最大数量,超过部分不显示 |
setMaxVisibleltems(int) | 设置最多能显示的项的数量,超过显示滚动条 |
setMinimumContentsLength(int) | 设置子项目显示的最小长度 |
setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy) | 设置宽度和高度的调整策略 |
serValidator(QValidator) | 设置输入内容的合法性验证 |
currentData(role=Qt.UserRole) | 获取当前项关联的数据 |
iconSize() | 返回图标尺寸 QSize |
itemIcon(index:int) | 根据索引获取图标QIcon |
itemText(index:int) | 根据索引获取项的文本 |
showPopup()、hidePopup() | 显示或隐裁列表 |
itemData(index: int,role=Qt.UserRole) | 根据索引获取项的关联数据 |
[slot]clear() | 从控件中清空所有的项 |
[slot]clearEditText() | 只清空可编辑的文字,不影响项 |
下拉列表框控件QComboBox的信号
下拉列表框控件QComboBox的信号如表所示
QComboBox的信号 | 说明 |
---|---|
activated(text:str) | 由用户激活某项时发送信号,而程序激活时不发送信号。如果有两个项的名称相同,则只发送带整数参数的信号 |
activated(index: int) | 由用户激活某项时发送信号,而程序激活时不发送信号。如果有两个项的名称相同,则只发送带整数参数的信号 |
currentIndexChanged(text:str) | 用户或程序改变当前项的索引时发送信号 |
currentIndexChanged(index:int) | 用户或程序改变当前项的索引时发送信号 |
highlighted(text: str) | 当光标经过列表的项时发送信号 |
highlighted(index: int) | 当光标经过列表的项时发送信号 |
editTextChanged(text:str) | 在可编辑状态下,改变可编辑文本时发送信号 |
currentTextChanged(text: str) | 用户或程序改变当前项的文本时发送信号 |
QComboBox 案例:地区选择
import sys
from PySide6 import QtWidgets
"""
QComboBox 案例:地区选择
由2个combobox组成,分别用于选择省、市,选中城市后获得对应的邮政编码
当第1个combobox的选中改变时,第2个combobox中的选项自动变换至对应列表
当第2个combobox的选中改变时,使用QLabel显示该地的邮政编码
"""
class MyWidget(QtWidgets.QWidget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setWindowTitle("QComboBox-案例")
self.resize(800,600)
# 创建存储城市信息的字典
self.city_dic = {
"北京": {
"东城区":"100010",
"西城区":"100032",
"朝阳区":"100020",
"丰台区":"100071",
"石景山区":"100043",
"海淀区":"100080",
},
"上海": {"黄浦区":"200001","徐汇区":"200030","长宁区":"200050"},
}
self.setup_ui()
def setup_ui(self)-> None:
"""设置界面并初始化"""
self.province_cbb = QtWidgets.QComboBox()
self.city_cbb = QtWidgets.QComboBox()
self.code_label = QtWidgets.QLabel()
# 使用布局管理器布局控件
layout = QtWidgets.QHBoxLayout()
layout.addWidget(self.province_cbb)
layout.addWidget(self.city_cbb)
layout.addWidget(self.code_label)
self.setLayout(layout)
# 初始化并连接信号
self.province_cbb.addItems(self.city_dic.keys())
self.province_cbb.currentTextChanged.connect(self.province_changed)# type: ignore
self.city_cbb.currentIndexChanged.connect(self.city_changed)# type: ignore
# 手动执行一次以为城市combobox添加初始项
self.province_changed(self.province_cbb.currentText())
def province_changed(self,pro_name: str)-> None:
"""
省份改变时的槽函数 \n
:param pro_name: 新的省名
:return: None
"""
# 先清空之前的条目
self.city_cbb.clear()
# 再添加条目
cities = self.city_dic[pro_name]
for city_name,city_code in cities.items():
# 将城市名作为text、邮政代码作为data添加条目
self.city_cbb.addItem(city_name,city_code)
def city_changed(self,item_index: int)-> None:
"""
城市改变时的槽函数 \n
:param item_index: 新的选中的条目索引
:return: None
"""
city_name = self.city_cbb.itemText(item_index)
city_code = self.city_cbb.itemData(item_index)
self.code_label.setText(f"{city_name}的邮政编码为{city_code}")
self.code_label.adjustSize()# 调节标签控件尺寸以适应新的内容
if __name__ =="__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec())