一、QComboBox(組合框)簡介
是一個組合控件,默認展示最小的空間給用戶操作,可通過下拉選項界面選取更多預設選項。

二、QComboBox的功能作用
1、數據操作
(1)框架


(2)操作及展示
1 cb = QComboBox(self) 2 cb.resize(400, 30) 3 4 # 單個添加條目 5 # cb.addItem("xx1") # 添加條目項 6 # cb.addItem(QIcon('xxx.png'),"xx2") # 添加帶圖標的條目 7 # 多個添加 8 # cb.addItems(['1','2','3']) # 可迭代對象(列表,元組)並且元素為字符串 9 10 # 插入條目 11 # cb.insertItem(1,"xxx") # 索引+內容 12 # cb.insertItem(1,QIcon('xxx.png'),'xxx') # 索引+圖標+內容 13 # cb.insertItems(1,('a','b','c')) # 插入多項 14 15 # 設置條目 16 # cb.setItemIcon(3,QIcon('open.png')) # 設置圖片 17 # cb.setItemText(4,'哈哈') # 修改文本 18 19 # 刪除條目 20 # cb.removeItem(5) # 移除索引為5的項 21 22 # 插入分割線 23 # cb.insertSeparator(2) 24 25 # 設置當前編輯文本 26 # cb.setCurrentIndex(4) # 一開始顯示的內容,通過索引指定 27 # cb.setCurrentText('娃哈哈') # 修改當前編輯的內容 28 # cb.setEditable(True) # 可編輯,可添加 29 # cb.setEditText('itlike') # 編輯文本,在文本可編輯狀態下才能操作 30 31 # 了解 32 model = QStandardItemModel() 33 34 item1 = QStandardItem('item1') 35 item2 = QStandardItem('item2') 36 item22 = QStandardItem('item22') 37 38 item2.appendRow(item22) 39 model.appendRow(item1) 40 model.appendRow(item2) 41 cb.setModel(model) 42 43 cb.setView(QTreeView(cb)) # 設置視圖(多級顯示)
2、常用數據獲取
(1)框架

(2)操作及展示
1 cb = QComboBox(self) 2 cb.resize(200, 40) 3 4 cb.addItems(['abc', '123', '456']) 5 cb.addItem(QIcon('xxx.png'), '娃哈哈', {'name': 'itlike'}) # 包含數據的條目 6 7 btn = QPushButton(self) 8 btn.move(300, 10) 9 btn.setText("測試按鈕") 10 # btn.clicked.connect(lambda :print(cb.count())) # 獲取條目數 11 # btn.clicked.connect(lambda :print(cb.currentIndex())) # 獲取當前的索引 12 # btn.clicked.connect(lambda :print(cb.currentText())) # 獲取當前的內容 13 # btn.clicked.connect(lambda :print(cb.currentData())) # 獲取當前提條目對應的數據 14 btn.clicked.connect( 15 lambda _, idx=cb.count() - 1: print(cb.itemIcon(idx), cb.itemText(idx), cb.itemData(idx))) # 獲取最后一個數據
3、數據限制
(1)框架

(2)操作及展示
1 cb = QComboBox(self) 2 cb.resize(200, 40) 3 4 cb.addItems(['abc', '123', '456']) 5 cb.addItem(QIcon('xxx.png'), '娃哈哈', {'name': 'itlike'}) # 包含數據的條目 6 7 btn = QPushButton(self) 8 btn.move(300, 10) 9 btn.setText("測試按鈕") 10 btn.clicked.connect(lambda: cb.addItem('it')) 11 12 # 數據限制 13 cb.setEditable(True) 14 cb.setMaxCount(6) # 設置最多數據條目 15 cb.setMaxVisibleItems(3) # 設置當前可展示的條目數
4、常規操作
(1)框架

(2)操作及展示
1 cb = QComboBox(self) 2 cb.resize(200, 40) 3 4 cb.addItems(['abc', '123', '456']) 5 cb.addItem(QIcon('xxx.png'), '娃哈哈', {'name': 'itlike'}) # 包含數據的條目 6 7 btn = QPushButton(self) 8 btn.move(300, 10) 9 btn.setText("測試按鈕") 10 11 # 常規操作 12 cb.setEditable(True) 13 14 cb.setDuplicatesEnabled(True) # 可重復設置 15 16 # cb.setFrame(False) # 取消邊框 17 18 cb.setIconSize(QSize(60, 60)) # 設置圖標大小 19 cb.setSizeAdjustPolicy(QComboBox.AdjustToContents) # 參照內容調整位置 20 21 # btn.clicked.connect(lambda :cb.clear()) # 清空所有條目 22 # btn.clicked.connect(lambda :cb.clearEditText()) # 清空編輯的內容 23 24 btn.clicked.connect(lambda: cb.showPopup()) # 修改為點擊彈出 25 26 cb.setCompleter(QCompleter(['123', 'abc', 'aaa', 'bbb'])) # 完成器,根據輸入彈出相關內容 27 28 # 還有驗證器
5、信號
(1)框架

(2)操作及展示
1 cb.setEditable(True) 2 # cb.activated.connect(lambda val:print("條目被激活",val)) # 信號默認發射整型數據,返回索引 3 cb.activated[str].connect(lambda val: print("條目被激活", val)) # 信號傳遞為字符串,返回更改內容 4 # cb.currentIndexChanged.connect(lambda val:print("當前索引改變",val)) # 返回改變的索引 5 # cb.currentIndexChanged[str].connect(lambda val:print("當前索引改變",val)) # 返回改變索引對應的條目名稱 6 # cb.currentTextChanged.connect(lambda val:print("當前文本改變",val)) # 返回改變條目或者輸入的內容 7 cb.editTextChanged.connect(lambda val: print("當前編輯的文本改變", val)) # 當前編輯的文本,與上面的一個類似 8 # cb.highlighted.connect(lambda val:print("高亮文本改變",val)) # 返回索引 9 cb.highlighted[str].connect(lambda val: print("高亮文本改變", val)) # 返回條目
6、綜合案例

1 # *******************QComboBox-綜合案例**********************開始 2 from PyQt5.Qt import * 3 4 class Window(QWidget): 5 def __init__(self): 6 super().__init__() 7 self.setWindowTitle("QComboBox綜合案例") 8 self.resize(500, 500) 9 self.city_dic = { 10 "北京":{ 11 '東城':'001', 12 '西城':'002', 13 '朝陽':'003', 14 '豐台':'004' 15 }, 16 '上海':{ 17 '黃埔':'005', 18 '徐匯':'006', 19 '長寧':'007', 20 '靜安':'008', 21 '松江':'009' 22 }, 23 '廣東':{ 24 '廣州':'010', 25 '深圳':'011', 26 '湛江':'012', 27 '佛山':'013' 28 } 29 } 30 self.setup_ui() 31 32 def setup_ui(self): 33 # 1.創建兩個下拉列表控件 34 prov = QComboBox(self) 35 city = QComboBox(self) 36 prov.move(100,100) 37 city.move(200,100) 38 self.prov = prov 39 self.city = city 40 41 42 # 3.監聽省下拉列表里面的當前值改變的信號 43 prov.currentTextChanged[str].connect(self.prov_changed) 44 # self.prov_changed(prov.currentText()) # 調用函數傳參,因為上線的信號與槽第一次不會被調用 45 46 # 4.監聽城市下來列表的當前值發生改變的信號 47 city.currentIndexChanged[int].connect(self.city_changed) 48 # self.city_changed(city.currentIndex()) 49 50 # 2.展示數據到第一個下拉選項控件當中 (先監聽信號,后添加數據,可以省略一些步驟) 51 prov.addItems(self.city_dic.keys()) 52 53 def prov_changed(self,prov_name): 54 print(prov_name) 55 # 根據省的名稱,獲取字典里面對應的城市字典 56 citys = self.city_dic[prov_name] 57 58 self.city.blockSignals(True) # 阻斷信號發射 59 self.city.clear() 60 self.city.blockSignals(False) # 打開信號發射 61 62 # self.city.addItems(citys.keys()) 63 for key,val in citys.items(): 64 self.city.addItem(key,val) 65 66 def city_changed(self,item_idx): 67 # print(item_idx) 68 print(self.city.itemData(item_idx)) 69 70 71 if __name__ == '__main__': 72 import sys 73 74 app=QApplication(sys.argv) 75 76 window=Window() 77 window.show() 78 sys.exit(app.exec_()) 79 # *******************QComboBox-綜合案例**********************結束
三、子類QFontComboBox
組合框中填充了按字母順序排列的字體系列名稱列表,讓用戶選擇字體家族。
繼承QComboBox。

1 # *******************QFontComboBox**********************開始 2 from PyQt5.Qt import * 3 4 class Window(QWidget): 5 def __init__(self): 6 super().__init__() 7 self.setWindowTitle("QFintComboBox") 8 self.resize(500, 500) 9 self.setup_ui() 10 11 def setup_ui(self): 12 fcb = QFontComboBox(self) 13 fcb.resize(300,50) 14 15 btn = QPushButton(self) 16 btn.move(350,10) 17 btn.setText("測試按鈕") 18 19 btn.clicked.connect(lambda :print(fcb.currentText())) # 獲取當前字體 20 21 label = QLabel(self) 22 label.setText("哈哈哈,呵呵呵") 23 label.move(200,225) 24 25 fcb.currentFontChanged.connect(lambda font:label.setFont(font)) # 設置字體 26 27 if __name__ == '__main__': 28 import sys 29 30 app=QApplication(sys.argv) 31 32 window=Window() 33 window.show() 34 sys.exit(app.exec_()) 35 # *******************QFontComboBox**********************結束
