PyQt5_QComboBox_下拉组合列表控件API

# QComboBox是组合控件
#           最小化展示,下拉按钮可以展开,选取多个预置选项
# 
#继承自QWidget
#
from PyQt5.Qt import *
##############################################限制多行文本框输入为10-90的数字
##############################################QComboBox 验证器 对象
#
# 现在需求:
#           限制组合框 条目文本的数值
#           必须
#                   数字 数字范围为10-90
#
# 解决方法:
#           验证器

#############################QComboBox 验证器 对象
class MyValidator(QValidator):
    def __init__(self,parent=None,*args,**kwargs):
        super().__init__(parent,*args,**kwargs)
    #按照顺序 可接受 中间状态,无效 三种状态
    def validate(self, p_str, p_int):
        try:
            current_num = int(p_str)
            if 10<=current_num<=90:
                return (QValidator.Acceptable,p_str,p_int)
            elif 0<=current_num<10:
                return (QValidator.Intermediate,p_str,p_int)
            else:
                return (QValidator.Invalid,p_str,p_int)
        except:
            if len(p_str)==0:
                return (QValidator.Intermediate,p_str,p_int)
            return (QValidator.Invalid,p_str,p_int)



    def fixup(self, p_str):
        try:
            current_num = int(p_str)
            if 0<=current_num<10:
                return '10'
            else:
                return '90'
        except:
            return '50'
#############################限制多行文本框输入为10-90的数字




class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('QComboBox')
        self.resize(500,500)
        self.iniUI()
        
    def iniUI(self):
        cb = QComboBox(self)#构造函数只需要传递一个父控件
        self.cb = cb
        cb.resize(self.width() * 8 / 12, self.height() / 6)
        cb.move((self.width() - cb.width()) / 2, (self.height() - cb.height()) / 2)
        btn = QPushButton(self)
        self.btn = btn
        self.btn_w = self.width() / 3
        self.btn_h = self.height() * 3 / 32
        self.btn.resize(self.btn_w, self.btn_h)
        self.btn_x = (self.width() - self.btn_w) / 2
        self.btn_y = self.height() * 7 / 8 + (self.height() / 8 - self.btn_h) / 2
        self.btn.setText('测试按钮')
        self.btn.setStyleSheet('font-size:30px')
        self.btn.move(self.btn_x, self.btn_y)
        self.btn.clicked.connect(self.btn_text)

        label = QLabel(self)
        self.label = label
        label.setText('豫章故郡,洪都新府')
        label.setAlignment(Qt.AlignCenter)
        label.setStyleSheet('font-size:35px;background-color:cyan;')
        label.resize(self.cb.width(), self.cb.height())
        label.move((self.width() - label.width()) / 2, self.cb.y() - self.cb.height() * 2.5)

        fcb = QFontComboBox(self)
        fcb.resize(self.cb.width()*2/3, self.cb.height()*2/3)
        fcb.move((self.width() - fcb.width()) / 2, self.cb.y() - fcb.height() * 2)
        fcb.currentFontChanged.connect(lambda fonte: self.label.setFont(fonte))

    def comboBoxAddInsertSetItem(self):
        self.cb.addItem(QIcon('aaa.png'),'PHP')
        self.cb.addItem(QIcon('bbb.png'),'Matlab')
        self.cb.addItems(['Python','C','C++','Java'])
        self.cb.insertItem(1,QIcon('ccc.png'),'Fortran')
        self.cb.insertSeparator(3)#在第三个条目前面插入分割线
        self.cb.setItemText(1,'Rust')#设置对应索引位置处的文本
        self.cb.setItemIcon(1,QIcon('ddd.png'))#设置对应索引位置处的图标
        self.cb.removeItem(6)#删除条目
        print(self.cb.count())



    ################################################设置为当前条目
    def comboBoxSetCurrent(self):
        self.comboBoxAddInsertSetItem()
        self.cb.setCurrentIndex(2)#选择第二个条目,设置索引为2的条目为当前条目
        self.cb.setCurrentText('Python')#设置名称为Python的条目为当前条目
        self.cb.setEditable(True)
        self.cb.setEditText('Python最牛批')

    ##############################################更改下拉列表界面展开时的模型结构
    # QAbstractItemModel
    # print(QAbstractItemModel.__subclasses__())
    def comboBoxModel(self):
        model = QStandardItemModel()#创建标准条目模型
        item1 = QStandardItem('Python')#创建条目对象
        item2 = QStandardItem('Sci_compute')
        item21= QStandardItem('Fortran')
        item22= QStandardItem('Rust')
        model.appendRow(item1)#创建子对象
        model.appendRow(item2)
        item2.appendRow(item21)#创建子子对象
        item2.appendRow(item22)
        self.cb.setModel(model)#把模型设置给控件
        # 把带有模型结构的控件 给树视角类,创建了一个视角对象,并将此视角设置给控件
        # QTreeView的父类是QAbstractItemView
        self.cb.setView(QTreeView(self.cb))
    ############################################更改下拉列表界面展开时的模型结构

    ##############################################QComboBox常用数据的获取


    def comboBoxGetData(self):
        self.comboBoxAddInsertSetItem()
        print(  self.cb.count(),'下拉列表条目总数')
        print(self.cb.itemText(0))#PHP
        print(self.cb.itemIcon(0))
        self.cb.setCurrentText('C++')
        print(self.cb.currentText())#C++
    #############################QComboBox常用数据的获取



    ##############################################QComboBox最大条目个数,最多展示条目数量 限制



    def comboBoxMax(self):
        self.comboBoxAddInsertSetItem()
        self.cb.setMaxCount(20)       #设置最多可容纳的条目个数
        self.cb.setMaxVisibleItems(18)#设置最多可展示的条目个数
    #############################QComboBox最大条目个数,最多展示条目数量 限制



    ##############################################QComboBox常规操作


    def comboBoxNormal(self):
        self.comboBoxAddInsertSetItem()
        self.cb.setEditable(True)#设置为可编辑
        self.cb.setDuplicatesEnabled(True)  #允许出现名称相同的条目
        self.cb.setIconSize(QSize(60,60))
        # self.cb.setSizeAdjustPolicy(QComboBox.AdjustToContents)
        self.cb.setMinimumContentsLength(self.cb.width())#设置最小内容长度
        self.cb.setSizeAdjustPolicy(QComboBox.AdjustToMinimumContentsLength)
        # self.cb.clear()                   #清空所有的条目
        # self.cb.clearEditText()           #清空当前正编辑的条目文本
        self.cb.showPopup()                 #使得组合框弹出下拉列表框
    #############################QComboBox常规操作



    ##############################################QComboBox 完成器对象


    def comboBoxCompleter(self):
        self.cb.setEditable(True)
        completer = QCompleter(['Python','PHP','VisualBasic','VFP','C++','C#'])
        self.cb.setCompleter(completer)
    #############################QComboBox 完成器对象


    ##############################################QComboBox 验证器 对象
    #
    # 现在需求:
    #           限制组合框 条目文本的数值
    #           必须
    #                   数字 数字范围为5-10
    #
    # 解决方法:
    #           验证器
    def comboBoxValidator(self):
        self.cb.setEditable(True)
        self.cb.setFocus()
        validator = MyValidator()
        self.cb.setValidator(validator)
    #############################QComboBox 验证器 对象
    
    
    
    ##############################################QComboBox 信号相关
    #
    # activated(int_index)
    # activated(str_text)               这两项必须是用户交互操作才能触发
    # currentIndexChanged(int_index)
    # currentIndexChanged(str_text)
    # currentTextChanged(str_text)
    # 
    def comboBoxSignal(self):
        self.comboBoxAddInsertSetItem()
        self.cb.activated.connect(lambda index:print('选中了第',index,'个条目,内容为:',self.cb.currentText()))
        # self.cb.activated[str].connect(lambda text:print('选中的条目 文本为:',text))
        # self.cb.currentIndexChanged.connect(lambda index:print('选中了第',index,'个条目,内容为:',self.cb.currentText()))
        self.cb.currentIndexChanged[str].connect(lambda text:print('选中的条目 文本为:',text))


    def btn_text(self):
        # self.comboBoxAddInsertSetItem()
        # self.comboBoxSetCurrent()
        # self.comboBoxModel()
        # self.comboBoxGetData()
        # self.comboBoxMax()
        # self.comboBoxNormal()
        # self.comboBoxCompleter()
        # self.comboBoxValidator()
        self.comboBoxSignal()




if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec_())

小白学习笔记,若感兴趣留个爪 ^. ^ hahah

你可能感兴趣的:(PyQt5)