7.5 QComboBox下拉框控制元件
阿新 • • 發佈:2022-04-12
一、QComboBox下拉框控制元件
1.基本概念
- QComboBox下拉框控制元件也屬於另一種樣式的組合控制元件
2.程式碼
點選檢視程式碼
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('aaa.png'), 'pyqt5視訊教程') self.qcb.addItems(['pyqt', 'pyqt5', 'python', 'django']) # 陣列 (多個條目新增) self.qcb.addItems(('pyqt', 'pyqt5', 'python', 'django')) # 元祖 (多個條目新增) # 1插入條目(第一個數字位置:插入的位置->從0開始,第二個位置:插入的內容) self.qcb.insertItem(1, 'PyQt5中文網') self.qcb.insertItem(3, QIcon('aaa.png'), 'pyqt5視訊教程') self.qcb.insertItems(2, ['pyqt','pyqt5','python','django']) # 2設定條目,可以修改指定位置的圖示和標題 self.qcb.setItemIcon(2, QIcon('aaa.png')) self.qcb.setItemText(3, 'django') # self.qcb.setItemData(2, QIcon('123.jpg')) # 使用者資料(獲取來的) # 3刪除條目 self.qcb.removeItem(2) # 插入分割線 self.qcb.insertSeparator(2) # 下拉框預設值設定 #self.qcb.setCurrentIndex(2) # 通過匹配索引設定下拉框預設值 #self.qcb.setCurrentText('python') # 通過匹配下拉框字串設定下拉框預設值 self.qcb.setEditable(True) # 文字可編輯,並可新增 self.qcb.setEditText('pyqt') # 讓下拉框中文字可以被編輯,首先要設定成可編輯 # # 資料獲取 # 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(21) # 設定最大儲存條目個數 self.qcb.setMaxVisibleItems(20) # 設定最大可見的條目個數 # 可重複 self.qcb.setEditable(True) #編輯文字框後,點選enter,之後文字框會新增該條目 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_())
4.案例
點選檢視程式碼
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_())