PyQt5下拉式复选框QComboCheckBox的实例

yipeiwu_com6年前Python基础

笔者在用PyQt5写GUI时碰到了需要使用下拉式复选框的情况,但是PyQt5中没有相应的组件,而网上找到的方法大多是qt使用的,所以不能直接拿来用。

没办法,在这种让人无奈的情况下,笔者只能根据网上大神们的方法试着自己写一个喽。

你还别说,真就让我写出来了。(笔者是个菜鸟新手,所以这小小的成功让我很开心)

然后笔者就很严肃地将这个组件命名为QComboCheckBox,也就是QComboBox和QCheckBox的拼接。

废话不多说,直接先上效果图:

然后是代码:(第一个是基础,第二个是带全选和清空功能)

from PyQt5.QtWidgets import QComboBox,QLineEdit,QListWidget,QCheckBox,QListWidgetItem
 
class 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,QListWidgetItem
 
class 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()清空已选项

以上这篇PyQt5下拉式复选框QComboCheckBox的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

使用Python的OpenCV模块识别滑动验证码的缺口(推荐)

最近终于找到一个好的方法,使用Python的OpenCV模块识别滑动验证码的缺口,可以将滑动验证码中的缺口识别出来了。   测试使用如下两张图片:   target....

PyQt5每天必学之单行文本框

PyQt5每天必学之单行文本框

本文实例为大家分享了PyQt5单行文本框展示的具体代码,供大家参考,具体内容如下 QLineEdit 是一个允许输入和编辑纯文本的单行控件。系统中的撤销、重做、复制、剪切和粘贴都可用于...

python 实现对文件夹中的图像连续重命名方法

python实现的对文件夹中的图像进行连续的重命名方法: import os class BatchRename(): def __init__(self): self.pa...

PyCharm导入python项目并配置虚拟环境的教程详解

PyCharm导入python项目并配置虚拟环境的教程详解

进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹; 打开了python项目后,需要配置该项目对应的python才可以正常运行; 配置步骤:File→...

Python实现的彩票机选器实例

Python实现的彩票机选器实例

本文实例讲述了Python实现彩票机选器的方法。分享给大家供大家参考。具体实现方法如下: # -*- coding: utf8 -*- from Tkinter import * i...