QComboBox 下拉选择框
- 描述
- 是一个组合控件,默认展示最小的空间给用户操作,可通过下拉选择界面, 选取更多的预置选项
- 继承自:QWidget
- 功能作用
- 构造函数
QComboBox(parent: QWidget = None) # 创建QComboBox对象的同时设置父对象
- 数据操作
addItem(str, userData: Any = None) # 添加一个条目,显示内容和后台数据 addItem(QIcon, str, userData: Any = None) # 添加添加一个条目,图标、显示内容和后台数据 addItems(Iterable[str]) # 通过一个迭代器添加一批条目 insertItem(int, str, userData: Any = None) # 在指定索引处插入一个条目,显示内容和后台数据 insertItem(int, QIcon, str, userData: Any = None) # 在指定索引处插入一个条目,图标、显示内容和后台数据 insertItems(int, Iterable[str]) # 在指定索引处通过一个迭代器添加一批条目 setItemIcon(int, QIcon) # 通过索引,设置该条目的图标 setItemText(int, str) # 通过索引,设置该条目的显示文本 setItemData(int, Any, role: int = Qt.UserRole) # 通过索引,设置用户数据 removeItem(int index) # 删除指定索引条目 insertSeparator(int index) # 在指定索引位置插入一条分割线 setCurrentIndex(int index) # 通过索引设置下拉框默认显示值 setCurrentText(QString text) # 通过条目显示文本设置下拉框默认显示值 setEditable(bool editable) # 设置默认值是否可以被编辑 # 允许被编辑时,编辑后按回车键,会将编辑后的新内容添加到下拉框中 setEditText(QString text) # 默认值设置可被编辑时,重新设置显示文本内容 # 了解模型操作(后面会具体讲模型) # 通过设置模型,可以使下拉框显示表格、数目录等 setModel(QAbstractItemModel model) setModelColumn(int visibleColumn) setRootModelIndex(QModelIndex index) model() modelColumn() rootModelIndex() # 了解视图操作 setView(QAbstractItemView *itemView) view() # 了解代理设置 setItemDelegate(QAbstractItemDelegate *delegate)
- 获取数据
count() -> int # 获取下拉选择框总条目数 itemIcon(int index) -> QIcon # 获取指定索引条目的图标对象 itemText(int index) -> str # 获取指定索引条目的文本内容 itemData(int index) -> Any # 获取指定索引条目的用户数据 currentIndex() -> int # 获取当前选中条目索引 currentText() -> str # 获取当前选中条目文本 currentDate() -> any # 获取当前选中条目用户数据 cb.itemIcon(cb.currentIndex()) # 配合使用,获取当前选中条目的图标
- 数据限制
setMaxCount(int max) # 设置最大存储条目数,达到最大后就不允许添加了,而不是删除老的,添加新的 maxCount() # 获取最大存储条目数 setMaxVisibleItems(int maxItems) # 设置下拉框一屏显示条目数,条目数过多则出现滚动条 maxVisibleItems() # 获取下拉框一屏显示条目数
- 常规操作
setEditable(bool editable) # 设置显示框是否可以被编辑 # 允许被编辑时,编辑后按回车键,会将编辑后的新内容添加到下拉框中 isEditable() # 获取显示框是否可以被编辑 setDuplicatesEnabled(bool enable) # 设置是否允许将重复内容追加到下拉框中(可编辑状态输入内容按回车时) duplicatesEnabled() # 获取是否允许将重复内容追加到下拉框中 setFrame(bool) # 设置是否显示边框 hasFrame() # 获取是否显示边框 setIconSize(QSize(w, h)) # 统一设置图标尺寸 iconSize() # 获取图标尺寸 setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy policy) # 设置下拉框尺寸调整策略 # 参数 QComboBox.SizeAdjustPolicy QComboBox.AdjustToContents # 组合框将始终根据内容进行调整 QComboBox.AdjustToContentsOnFirstShow # 组合框将在第一次显示时调整其内容。 QComboBox.AdjustToMinimumContentsLength # 组合框将调整为设置的最小内容长度进行调整,请改用AdjustToContents或AdjustToContentsOnFirstShow。 QComboBox.AdjustToMinimumContentsLengthWithIcon # 组合框将调整为设置最小内容长度加上图标的空间。出于性能原因,请在大型模型上使用此策略。 sizeAdjustPolicy() -> QComboBox.SizeAdjustPolicy # 获取下拉框尺寸调整策略 setMinimumContentsLength(int characters) # 设置最小内容长度 minimumContentsLength() -> int # 获取最小内容长度
- 清空
clear() # 清除所有存储的条目 clearEditText() # 清除组合框中处于编辑的内容(清除选中内容)
- 弹出
showPopup() # 弹出下拉框
- 完成器(过滤匹配项/隐藏不匹配项)
-
setCompleter(QCompleter completer) # 设置完成器 completer() -> QCompleter # 获取完成器对象
-
- 验证器
- 详见:QValidator_验证器对象
setValidator(QValidator validator) # 设置验证器 # 传入一个QValidator对象 # 通过子类化QValidator类,重写validator() 和 fixup() 方法,对输入内容进行验证 # validator() # 获取验证器对象
- 构造函数
- 可用信号
activated(int index) # 某个条目被选中时(必须是用户交互), 造成的值改变才会发射这个信号,发送选中条目的索引 activated(QString text) # (重载)某个条目被选中时(必须是用户交互), 造成的值改变才会发射这个信号,发送选中条目的显示文本 currentIndexChanged(int index) # 当前选中的索引发生改变时(用户交互、代码控制),发送选中条目的索引 currentIndexChanged(QString text) # (重载)当前选中的索引发生改变时(用户交互、代码控制),发送选中条目的显示文本 currentTextChanged(QString text) # 当前的文本内容发生改变时,发送新的文本内容(包括重新选中条目、修改当前条目的显示文本) editTextChanged(QString text) # 可编辑状态下,编辑的文本发生改变时,发送新的文本内容 highlighted(int index) # 高亮发生改变时,发送高亮条目的索引(鼠标放上去的时候) highlighted(QString text) # (重载)高亮发生改变时,发送高亮条目的显示文本,鼠标放上去的时候 textHighlighted(self, str) # 显示文本高亮发生改变时,发送高亮条目的显示文本
- 下拉选择框对象处于可编辑状态时
- 修改文本内容时,触发
currentTextChanged
和editTextChanged
- 修改文本内容后按下回车,触发
activated
和currentIndexChanged
- 修改文本内容时,触发
- 下拉选择框对象处于可编辑状态时
- 知识点补充
QFontComboBox
- 描述
- 字体家族选择下拉选择框
- 组合框中填充了按字母顺序排列的字体系列名称列表,让用户选择字体家族
- 后面还会学习字体选择对话框控件:QFontDialog
- 继承自:QComboBox
- 功能作用
- 设置和获取当前字体
setCurrentFont(QFont f) currentFont() -> QFont
- 设置和获取过滤器
setFontFilters(QFontComboBox.FontFilters) fontFilters() -> QFontComboBox.FontFilters # 参数 QFontComboBox.FontFilters QFontComboBox.AllFonts # 显示所有字体 QFontComboBox.ScalableFonts # 显示可缩放字体 QFontComboBox.NonScalableFonts # 显示不可缩放的字体 QFontComboBox.MonospacedFonts # 显示等宽字体 QFontComboBox.ProportionalFonts # 显示比例字体
- 设置和获取当前字体
- 信号
# 继承父类 currentIndexChanged(QString int) # 当前索引发生改变时发射信号,传递条目索引号 currentIndexChanged(QString text) # (重载)当前索引发生改变时发射信号,传递条目显示内容 currentFontChanged(QFont font) # 当前字体发生改变时发射信号,传递一个QFont对象
- 代码示例
- 示例1:QComboBox创建使用
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QComboBox-创建使用') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): cb = QComboBox(self) cb.resize(150, 30) cb.move(10, 50) btn = QPushButton('获取数据1',self) btn.move(10, 100) btn2 = QPushButton('获取数据2', self) btn2.move(120, 100) pass # 添加条目 # ****************添加条目****************** 开始 # cb.addItem('湖南') # cb.addItem('湖北') # cb.addItem(QIcon('../images/jpg/home.jpg'), '北京') # cb.addItems(['广东','四川','江西','广西']) # ****************添加数据****************** 结束 pass # 插入条目 # ****************插入条目****************** 开始 # cb.insertItem(0, '甘肃') # cb.insertItem(1, QIcon('../images/jpg/save.jpg'), '陕西') # cb.insertItems(1, ('黑龙江','吉林','辽宁')) # ****************插入条目****************** 结束 pass # 设置条目 # ****************设置条目****************** 开始 # cb.setItemIcon(0, QIcon('../images/jpg/save.jpg')) # cb.setItemText(0,'甘肃省') # cb.setItemData(0, '甘肃') # ****************设置条目****************** 结束 pass # 模型操作 # ****************模型操作****************** 开始 # 模型操作、视图操作、代理设置后面会详细讲解 # ****************模型操作****************** 结束 pass # 删除条目 # ****************删除条目****************** 开始 # cb.removeItem(0) # ****************删除条目****************** 结束 pass # 插入分割线 # ****************插入分割线****************** 开始 # cb.insertSeparator(3) # cb.insertSeparator(6) # ****************插入分割线****************** 结束 pass # 设置默认显示值 # ****************设置默认显示值****************** 开始 # cb.setCurrentIndex(4) # cb.setCurrentText('广东') # cb.setEditable(True) # cb.setEditText('广东省啊') # ****************设置默认显示值****************** 结束 pass # 获取数据 # ****************获取数据****************** 开始 # ls = ['湖南','广东', '四川', '江西', '广西', '黑龙江', '吉林', '辽宁','湖北'] # for i, v in enumerate(ls): # cb.addItem(v, i * 10) # # def btn_cao(): # print('count:', cb.count()) # print('Index:', cb.currentIndex()) # print(' Text:', cb.currentText()) # print(' Date:', cb.currentData()) # print(' Icon:', cb.itemIcon(cb.currentIndex())) # # def btn_cao2(): # print(cb.itemIcon(cb.count()-1)) # print(cb.itemText(cb.count()-1)) # print(cb.itemData(cb.count()-1)) # # # btn.clicked.connect(btn_cao) # # btn2.clicked.connect(btn_cao2) # print(cb.count()) # btn2.clicked.connect(lambda _, index=cb.count()-1: print(cb.itemIcon(index), cb.itemText(index), cb.itemData(index))) # # clicked(self, checked: bool = False) # # 由于clicked信号会默认发射一个参数False(0) ,所以lambda中需要增加一个"_"变量来忽略这个参数(或者添加一个变量接收这个参数,后面不用) # ****************获取数据****************** 结束 pass # 数据条目限制 # ****************数据条目限制****************** 开始 # cb.setMaxCount(20) # cb.setMaxVisibleItems(15) # # ls = ['河北', '山西', '黑龙江', '吉林', '辽宁', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', \ # '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '西藏', \ # '宁夏', '新疆', '北京', '天津', '上海', '重庆', '香港', '澳门'] # for i, v in enumerate(ls): # cb.addItem(v, i * 10) # ****************数据条目限制****************** 结束 pass # 常规操作 # ****************常规操作****************** 开始 # ls = ['河北', '山西', '黑龙江', '吉林', '辽宁', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', \ # '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '西藏', \ # '宁夏', '新疆', '北京', '天津', '上海', '重庆', '香港', '澳门'] # for i, v in enumerate(ls): # cb.addItem(v, i * 10) # # cb.setEditable(True) # 选中条目是否允许被编辑 # cb.setDuplicatesEnabled(False) # 可编辑条目重复时,是否允许被追加到下拉框中 # cb.setFrame(False) # 是否显示边框 # # cb.setItemIcon(0, QIcon('../images/jpg/home.jpg')) # 设置条目图标 # # cb.setItemIcon(1, QIcon('../images/jpg/edit.jpg')) # 设置条目图标 # # cb.setIconSize(QSize(100, 100)) # 统一设置图标尺寸 # cb.setSizeAdjustPolicy(QComboBox.AdjustToContents) # 设置下拉框尺寸调整策略 # cb.setMinimumContentsLength(10) # 设置最小内容长度 # ****************常规操作****************** 结束 pass # 其他操作 # ****************其他操作****************** 开始 # ls = ['河北', '山西', '黑龙江', '吉林', '辽宁', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', \ # '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '西藏', \ # '宁夏', '新疆', '北京', '天津', '上海', '重庆', '香港', '澳门'] # for i, v in enumerate(ls): # cb.addItem(v, i * 10) # # cb.setEditable(True) # btn.setText('清除所有条目') # btn2.setText('清除编辑条目') # btn.clicked.connect(lambda :cb.clear()) # 清除所有条目 # btn2.clicked.connect(lambda :cb.clearEditText()) # 清除当前编辑条目 # btn.setText('弹出下拉框') # btn.clicked.connect(lambda :cb.showPopup()) # cp = QCompleter(['Fengzi','Shixinfeng','aaa','bbb','ababa']) # cb.setCompleter(cp) # 完成器 # vld = QValidator # cb.setValidator(vld) # ****************其他操作****************** 结束 pass # 可用信号 # ****************可用信号****************** 开始 ls = ['河北', '山西', '黑龙江', '吉林', '辽宁', '江苏', '浙江', '安徽', '福建', '江西', '山东', '河南', '湖北', \ '湖南', '广东', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '台湾', '内蒙古', '广西', '西藏', \ '宁夏', '新疆', '北京', '天津', '上海', '重庆', '香港', '澳门'] for i, v in enumerate(ls): cb.addItem(v, i * 10) # cb.setEditable(True) # 选中条目是否允许被编辑 # cb.activated.connect(lambda val:print('选中条目发生了改变',val)) # cb.activated[str].connect(lambda val:print('选中条目发生了改变',val)) # # cb.currentIndexChanged.connect(lambda val: print('当前选中的索引发生了改变',val)) # cb.currentIndexChanged[str].connect(lambda val: print('当前选中的索引发生了改变',val)) # # cb.currentTextChanged.connect(lambda val: print('选中文本发生了改变', val)) # # cb.editTextChanged.connect(lambda val:print('可编辑文本发生了改变', val)) # # btn.clicked.connect(lambda :cb.setItemText(0, '测试一下')) btn2.clicked.connect(lambda :cb.setCurrentIndex(2)) # cb.highlighted.connect(lambda val:print('高亮显示', val)) # cb.highlighted[str].connect(lambda val:print('高亮显示', val)) cb.textHighlighted.connect((lambda val:print('text高亮', val))) # ****************可用信号****************** 结束 if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 示例2:二级联动下拉框案例
- 要求:给定城市数据,实现两级联动效果。选择城市后输出城市对应的ID
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QComboBox-二级联动') self.resize(500, 500) self.pro_dic = {'湖南': {'长沙':'001001', '株洲':'001002', '湘潭':'001003', '衡阳':'001004', '邵阳':'001005', '岳阳':'001006', '张家界': '001007', '益阳': '001008', '常德': '001009', '娄底': '001010', '郴州': '001011', '永州': '001012', '怀化': '001013' }, '北京':{'东城区':'002001', '西城区':'002002', '朝阳区':'002003', '丰台区':'002004', '石景山区':'002005', '海淀区':'002006', '顺义区':'002007', '通州区':'002008', '大兴区':'002009', '房山区':'002010', '门头沟区':'002011', '昌平区':'002012', '平谷区':'002013', '密云区':'002014', '怀柔区':'002015', '延庆区':'002016'}, '广东':{'广州':'003001', '深圳':'003002', '珠海':'003003', '汕头':'003004', '佛山':'003005', '韶关':'003006', '湛江':'003007', '肇庆':'003008', '江门':'003009', '茂名':'003010', '惠州':'003011', '梅州':'003012', '汕尾':'003013', '河源':'003014', '阳江':'003015', '清远':'003016', '东莞':'003017', '中山':'003018', '潮州':'003019', '揭阳':'003020'} } self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): cb_province = QComboBox(self) cb_city = QComboBox(self) self.cb_province = cb_province self.cb_city = cb_city cb_province.resize(150, 30) cb_city.resize(150, 30) x = 10 y = 10 cb_province.move(x, y) cb_city.move(cb_province.x()+cb_province.width()+5, cb_province.y()) # 省份发生变化时触发信号,联动城市下拉框 cb_province.currentIndexChanged[str].connect(self.pro_changed) # 城市发生变化时触发信号,打印城市对应的ID self.cb_city.currentIndexChanged.connect(self.city_changed) # 给省份下拉框控件添加数据 cb_province.addItems(self.pro_dic.keys()) def pro_changed(self,pro_name): self.cb_city.blockSignals(True) # 取消城市下拉框发射信号 # 清空城市下拉框条目 self.cb_city.clear() self.cb_city.blockSignals(False) # 恢复城市下拉框发射信号 # 城市下拉框控件添加省份对应城市和ID for key,val in self.pro_dic[pro_name].items(): self.cb_city.addItem(key, val) def city_changed(self, city_index): # 获取城市ID city_id = self.cb_city.itemData(city_index) print(city_id) if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 示例3:QFontComboBox示例
from PyQt5.Qt import * import sys class Windows(QWidget): def __init__(self): super().__init__() self.setWindowTitle('QFontComboBox-创建使用') self.resize(500, 500) self.widget_list() def widget_list(self): self.add_widget() def add_widget(self): labe = QLabel(self) labe.setText("我喜欢学习Python编程!") labe.move(20, 50) fcb = QFontComboBox(self) fcb.setEditable(False) # 设置选中条目不可被编辑 fcb.move(20, 100) # ****************设置过滤器****************** 开始 fcb.setFontFilters(QFontComboBox.AllFonts) # 显示所有字体 # fcb.setFontFilters(QFontComboBox.ScalableFonts) # 显示可缩放字体 # fcb.setFontFilters(QFontComboBox.NonScalableFonts) # 显示不可缩放的字体 # fcb.setFontFilters(QFontComboBox.MonospacedFonts) # 显示等宽字体 # fcb.setFontFilters(QFontComboBox.ProportionalFonts) # 显示比例字体 # ****************设置过滤器****************** 结束 # ****************可用信号****************** 开始 # 当前字体发生改变时发生信号,传递一个QFont对象 fcb.currentFontChanged.connect(lambda font:labe.setFont(font)) # 当前索引号发生改变时发射信号,传递条目索引号 fcb.currentIndexChanged.connect(lambda index:print('index发生了改变',index)) # (重载)当前索引号发生改变时发射信号,传递条目显示文本 fcb.currentIndexChanged[str].connect(lambda s:print('index发生了改变',s)) # ****************可用信号****************** 结束 if __name__ == '__main__': app = QApplication(sys.argv) window = Windows() window.show() sys.exit(app.exec_())
- 示例4:QComboBox通过`QCompleter`生成器实现过滤(隐藏)不匹配项
- 可编辑状态输入内容自动过滤出相匹配的选项
from PyQt5.Qt import *
import sys
class MyTest(QWidget):
def __init__(self):
super(MyTest, self).__init__()
self.items = ['item1', 'item2', 'item3', '张三', '李四', '王五']
self.resize(200, 100)
self.test()
def test(self):
cmb = QComboBox(self)
self.cmb = cmb
cmb.resize(100, 50)
cmb.setEditable(True)
cmb.setDuplicatesEnabled(False)
# 给下拉选择框添加下拉选项
cmb.addItems(self.items)
# 下拉框编辑文本发生改变时触发事件
cmb.editTextChanged.connect(self.cmb_textchanged)
layout = QHBoxLayout()
layout.addWidget(cmb)
self.setLayout(layout)
def cmb_textchanged(self, newtxt):
commpleter = QCompleter(self.items, self.cmb)
self.cmb.setCompleter(commpleter)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyTest()
win.show()
sys.exit(app.exec_())