42- 输入和显示-下拉列表框控件QComBox

下拉列表框控件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(根据最小长度调整)
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())

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值