其他分享
首页 > 其他分享> > 7.5 QComboBox下拉框控件

7.5 QComboBox下拉框控件

作者:互联网

一、QComboBox下拉框控件

1.基本概念

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://www.icode9.com/i/l/?n=22&i=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://www.icode9.com/i/l/?n=22&i=blog/2520904/202204/2520904-20220412094129716-1686741716.png)

标签:qcb2,控件,self,QComboBox,条目,qcb,print,下拉框
来源: https://www.cnblogs.com/yuyingblogs/p/16133703.html