PyQt5下拉式复选框QComboCheckBox

来源:互联网 发布:网络流行词2017 编辑:程序博客网 时间:2024/05/22 04:45
笔者在用PyQt5写GUI时碰到了需要使用下拉式复选框的情况,但是PyQt5中没有相应的组件,而网上找到的方法大多是qt使用的,所以不能直接拿来用。
没办法,在这种让人无奈的情况下,笔者只能根据网上大神们的方法试着自己写一个喽奋斗
你还别说,真就让我写出来了。(笔者是个菜鸟新手,所以这小小的成功让我很开心吐舌头
然后笔者就很严肃地将这个组件命名为QComboCheckBox,也就是QComboBox和QCheckBox的拼接大笑
废话不多说,直接先上效果图:


然后是代码:(第一个是基础,第二个是带全选和清空功能)
from PyQt5.QtWidgets import QComboBox,QLineEdit,QListWidget,QCheckBox,QListWidgetItemclass ComboCheckBox(QComboBox):    def __init__(self,items):#items==[str,str...]        super(ComboCheckBox,self).__init__()        self.items=items        self.qCheckBox=[]        self.qLineEdit=QLineEdit()        self.qLineEdit.setReadOnly(True)        qListWidget=QListWidget()        self.row_num=len(self.items)        for i in range(self.row_num):            self.qCheckBox.append(QCheckBox())            qItem=QListWidgetItem(qListWidget)            self.qCheckBox[i].setText(self.items[i])            qListWidget.setItemWidget(qItem,self.qCheckBox[i])            self.qCheckBox[i].stateChanged.connect(self.show)                self.setLineEdit(self.qLineEdit)                 self.setModel(qListWidget.model())        self.setView(qListWidget)    def Selectlist(self):        Outputlist=[]        for i in range(self.row_num):            if self.qCheckBox[i].isChecked()==True:                Outputlist.append(self.qCheckBox[i].text())        return Outputlist    def show(self):        show=''        self.qLineEdit.setReadOnly(False)        self.qLineEdit.clear()        for i in self.Selectlist():            show+=i+';'        self.qLineEdit.setText(show)        self.qLineEdit.setReadOnly(True)from PyQt5.QtWidgets import QComboBox,QLineEdit,QListWidget,QCheckBox,QListWidgetItemclass ComboCheckBox(QComboBox):    def __init__(self,items):#items==[str,str...]        super(ComboCheckBox,self).__init__()        self.items=items        self.items.insert(0,'全部')        self.row_num=len(self.items)        self.Selectedrow_num=0        self.qCheckBox=[]        self.qLineEdit=QLineEdit()        self.qLineEdit.setReadOnly(True)        self.qListWidget=QListWidget()        self.addQCheckBox(0)        self.qCheckBox[0].stateChanged.connect(self.All)        for i in range(1,self.row_num):            self.addQCheckBox(i)            self.qCheckBox[i].stateChanged.connect(self.show)        self.setModel(self.qListWidget.model())        self.setView(self.qListWidget)        self.setLineEdit(self.qLineEdit)             def addQCheckBox(self,i):        self.qCheckBox.append(QCheckBox())        qItem=QListWidgetItem(self.qListWidget)        self.qCheckBox[i].setText(self.items[i])        self.qListWidget.setItemWidget(qItem,self.qCheckBox[i])            def Selectlist(self):        Outputlist=[]        for i in range(1,self.row_num):            if self.qCheckBox[i].isChecked()==True:                Outputlist.append(self.qCheckBox[i].text())        self.Selectedrow_num=len(Outputlist)        return Outputlist     def show(self):        show=''        Outputlist=self.Selectlist()        self.qLineEdit.setReadOnly(False)        self.qLineEdit.clear()        for i in Outputlist:            show+=i+';'        if self.Selectedrow_num==0:            self.qCheckBox[0].setCheckState(0)        elif self.Selectedrow_num==self.row_num-1:            self.qCheckBox[0].setCheckState(2)        else:            self.qCheckBox[0].setCheckState(1)        self.qLineEdit.setText(show)        self.qLineEdit.setReadOnly(True)    def All(self,zhuangtai):        if zhuangtai==2:            for i in range(1,self.row_num):                self.qCheckBox[i].setChecked(True)        elif zhuangtai==1:            if self.Selectedrow_num==0:                self.qCheckBox[0].setCheckState(2)        elif zhuangtai==0:            self.clear()    def clear(self):        for i in range(self.row_num):            self.qCheckBox[i].setChecked(False)
使用方法:
a=ComboCheckBox('子项列表')
Selectlist()获取被选子项列表
All()全选
clear()清空已选项

原创粉丝点击