QComboBox下拉框控件
一、学习指导
QComboBox下拉框控件也属于另一种样式的组合控件,虽然和之前学习的步长调节器有很多不同之处,但是也属于步长调节器的一种,这节课主要讲一下QComboBox下拉框控件属性、API和条目设置等功能,其中条目设置比较重要。
二、代码演示
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QComboBox下拉框控件 - PyQt5中文网") self.resize(600, 500) self.func_list() def func_list(self): self.func() def func(self): self.qcb = QComboBox(self) self.qcb.move(150,150) self.qcb.resize(150,40) self.btn = QPushButton('按钮', self) self.btn.resize(60, 30) self.btn.move(150, 250) self.btn.pressed.connect(self.test) def test(self): # 增加条目 # self.qcb.addItem('PyQt5中文网') # self.qcb.addItem(QIcon('123.jpg'), 'pyqt5视频教程') # self.qcb.addItems(['pyqt', 'pyqt5', 'python', 'django']) # 数组 # self.qcb.addItems(('pyqt', 'pyqt5', 'python', 'django')) # 元祖 # 插入条目 # self.qcb.insertItem(1, 'PyQt5中文网') # self.qcb.insertItem(3, QIcon('123.jpg'), 'pyqt5视频教程') # self.qcb.insertItems(2, ['pyqt','pyqt5','python','django']) # 设置条目,可以修改指定位置的图标和标题 # self.qcb.setItemIcon(2, QIcon('123.jpg')) # self.qcb.setItemText(2, 'django') # self.qcb.setItemData(2, QIcon('123.jpg')) # 用户数据(获取来的) # 删除条目 # self.qcb.removeItem(2) # 插入分割线 # self.qcb.insertSeparator(2) # 下拉框默认值设定 # self.qcb.setCurrentIndex(2) # 通过匹配索引设置下拉框默认值 # self.qcb.setCurrentText('python') # 通过匹配下拉框字符串设置下拉框默认值 # self.qcb.setEditable(True) # 文本可编辑,并可添加 # self.qcb.setEditText('WWWWWW') # 让下拉框中文本可以被编辑,首先要设置成可编辑 # 数据获取 self.qcb.addItem(QIcon('123.jpg'), 'python', {'name', 'PyQt5'}) # print(self.qcb.count()) # 条目个数 print(self.qcb.itemIcon(3)) # 指定条目图片对象 # print(self.qcb.itemIcon(self.qcb.currentIndex())) # 指定索引的图片对象 # print(self.qcb.itemText(3)) # 指定条目标题 print(self.qcb.itemData(0)) # 指定条目数据{'name', 'PyQt5'} # print(self.qcb.currentIndex()) # 当前索引 # print(self.qcb.currentText()) # 当前文本 print(self.qcb.currentData()) # 返回当前数据{'name', 'PyQt5'} # 下拉框数据个数限制 self.qcb.setMaxCount(8) # 设置最大存储条目个数 self.qcb.setEditable(True) self.qcb.setMaxVisibleItems(10) # 设置最大可见的条目个数 # 可重复 self.qcb.setDuplicatesEnabled(False) # 条目中不能出现两个或多个重复数据 # 有边框 self.qcb.setFrame(False) # 图标尺寸 self.qcb.setIconSize(QSize(20,20)) # 尺寸调整策略 # QComboBox.AdjustToContents # QComboBox.AdjustToMinimumContentsLength # QComboBox.AdjustToContentsOnFirstShow # 默认值 # QComboBox.AdjustToMinimumContentsLengthWithIcon self.qcb.setSizeAdjustPolicy(QComboBox.AdjustToMinimumContentsLength) # 调整下拉框宽度 # 清空 self.qcb.clear() # 清空下拉内容 self.qcb.clearEditText() # 清空被编辑的内容 self.qcb.showPopup() # 弹出下拉框 # 下拉匹配 self.qcb.setCompleter(QCompleter(['pyqt', 'pyqt5', 'python', 'django'])) # 可用信号 # self.qcb.activated() # 某个条目被用户选中, # self.qcb.currentIndexChanged() # 当前选中条目索引发生改变 # self.qcb.currentTextChanged() # 当前选中条目文本发生变化 # self.qcb.editTextChanged() # 编辑文本时 # self.qcb.highlighted() # 高亮==鼠标停留产生的高亮 # self.qcb.activated.connect(lambda val: print(val)) # self.qcb.activated[str].connect(lambda val: print(val)) # self.qcb.currentIndexChanged.connect(lambda val: print(val)) # self.qcb.currentIndexChanged[str].connect(lambda val: print(val)) # self.qcb.setEditable(True) # self.qcb.editTextChanged.connect(lambda val: print(val)) self.qcb.highlighted.connect(lambda val: print(val)) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
下面给大家一个案例代码,学好上面的下拉框内容后看起来比较容易,这也是一段比较有用的素材,后期开发软件的时候可以直接拿去使用。
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("QComboBox下拉框案例 - PyQt5中文网") self.resize(600, 500) self.city_dic = { '江苏省': { '南京': '025', '徐州市': '0516', '淮安市': '0517', '盐城市': '0515', '扬州市': '0514', '苏州市': '0512', }, '浙江省': { '杭州市': '0571', '宁波市': '0574', '金华市': '0579', '舟山市': '0580', '温州市': '0577', '台州市': '0576', }, '安徽省': { '合肥市': '0551', '滁州市': '0550', '宿州市': '0557', '巢湖市': '0565', '黄山市': '0559', '宣州市': '0563', }, '河北省': { '石家庄市': '0311', '邯郸市': '0310', '保定市': '0312', '唐山市': '0315', '沧州市': '0317 ', '衡水市': '0318', '邢台市': '0319', }, } self.func_list() def func_list(self): self.func() def func(self): self.qcb1 = QComboBox(self) self.qcb1.move(100, 150) self.qcb1.resize(100, 40) self.qcb2 = QComboBox(self) self.qcb2.move(240, 150) self.qcb2.resize(100, 40) # 1.获取省一级,这里要先链接信号,然后添加数据,数据从无到有也能触发信号 # self.qcb1.addItems(self.city_dic.keys()) self.qcb1.currentIndexChanged[str].connect(self.qcb1_changed) self.qcb1.addItems(self.city_dic.keys()) # 2.获得当前选中省的名称 self.qcb1_changed(self.qcb1.currentText()) # 4.城市区号获取方法 self.qcb2.currentIndexChanged[int].connect(self.qcb2_changed) self.qcb2_changed(self.qcb2.currentIndex()) def qcb1_changed(self, name): # print(name) # 3.根据省的名称到字典中查找下级城市名称 citys = self.city_dic[name] # print(citys) # 从字典中获取下级城市名称到下一个下拉框中 ''' # self.qcb2.addItems(citys.keys()) # 这只会追加城市,所以要清空之前的数据,在重新添加条目 self.qcb2.clear() # self.qcb2.addItems(citys.keys()) ''' self.qcb2.blockSignals(True) self.qcb2.clear() # 这里会出现None结果,参考97行代码 self.qcb2.blockSignals(False) for key, val in citys.items(): # 通过增加val数据来获取 self.qcb2.addItem(key, val) # print(citys.items()) def qcb2_changed(self, num): # 这里传入条目的索引值 # print(num) # 这里值为-1,会打印None print(self.qcb2.itemData(num)) # 这里注意itemData()的用法 if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())