当前位置: 首页 PyQt5步长调节器 QComboBox下拉框控件
add-vip

QComboBox下拉框控件

一、学习指导

QComboBox下拉框控件也属于另一种样式的组合控件,虽然和之前学习的步长调节器有很多不同之处,但是也属于步长调节器的一种,这节课主要讲一下QComboBox下拉框控件属性、API和条目设置等功能,其中条目设置比较重要。

二、代码演示

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('123.jpg'), 'pyqt5视频教程')
        # self.qcb.addItems(['pyqt', 'pyqt5', 'python', 'django'])  # 数组
        # self.qcb.addItems(('pyqt', 'pyqt5', 'python', 'django'))  # 元祖

        # 插入条目
        # self.qcb.insertItem(1, 'PyQt5中文网')
        # self.qcb.insertItem(3, QIcon('123.jpg'), 'pyqt5视频教程')
        # self.qcb.insertItems(2, ['pyqt','pyqt5','python','django'])

        # 设置条目,可以修改指定位置的图标和标题
        # self.qcb.setItemIcon(2, QIcon('123.jpg'))
        # self.qcb.setItemText(2, 'django')
        # self.qcb.setItemData(2, QIcon('123.jpg'))  # 用户数据(获取来的)

        # 删除条目
        # self.qcb.removeItem(2)

        # 插入分割线
        # self.qcb.insertSeparator(2)

        # 下拉框默认值设定
        # self.qcb.setCurrentIndex(2)  # 通过匹配索引设置下拉框默认值
        # self.qcb.setCurrentText('python')  # 通过匹配下拉框字符串设置下拉框默认值
        # self.qcb.setEditable(True)  # 文本可编辑,并可添加
        # self.qcb.setEditText('WWWWWW')  # 让下拉框中文本可以被编辑,首先要设置成可编辑

        # 数据获取
        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(8)  # 设置最大存储条目个数
        self.qcb.setEditable(True)
        self.qcb.setMaxVisibleItems(10)  # 设置最大可见的条目个数

        # 可重复
        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_())

下面给大家一个案例代码,学好上面的下拉框内容后看起来比较容易,这也是一段比较有用的素材,后期开发软件的时候可以直接拿去使用。


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_())


相关文章