1. 程式人生 > 其它 >7.5 QComboBox下拉框控制元件

7.5 QComboBox下拉框控制元件

一、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_())
## 3.效果 ![](https://img2022.cnblogs.com/blog/2520904/202204/2520904-20220412093638036-452256073.gif)

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_())
效果: ![](https://img2022.cnblogs.com/blog/2520904/202204/2520904-20220412094129716-1686741716.png)