PyQt5Day21--輸入控件QComboBox(組合框)+子類QFontComBox


一、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**********************結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM