自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码


Posted in Python onMarch 30, 2020

自定义实现 PyQt5 下拉复选框 ComboCheckBox

一、前言

由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下拉复选框,主要就是继承 QComboBox 类,然后将复选框 QCheckBox 加入其中,并实现相应的功能。

最终实现的下拉复选框效果如下:

自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码

二、代码实现

1.主要方法

在 PyQt5 中,有几个主要的方法需要了解一下,方法名称和对应的含义如下:

QtWidgets.QComboBox.setView( itemView ) :设置 组合框弹出窗口中使用的视图 , 组合框获取视图的所有权。
QtWidgets.QcomboBox.setLineEdit( QLineEdit ) : 设置组合框 使用 的行 ,而不是当前行编辑窗口小部件。
QtWidgets.QListWidget.setItemWidget(item, widget) : 设置 要在给定的 item 中的 widget 组件 。

2.具体代码

实现下拉复选框的思路为用 setView() 方法将 QComboBox 下拉列表的视图改为 QListWidget 组件,然后将 QCheckBox 复选框用在 QListWiget 中,具体代码如下:

class ComboCheckBox(QComboBox):
  def __init__(self, items: list):
    """
    initial function
    :param items: the items of the list
    """
    super(ComboCheckBox, self).__init__()
    self.items = items # items list
    self.box_list = [] # selected items
    self.text = QLineEdit() # use to selected items
    self.text.setReadOnly(True)
    q = QListWidget()
    for i in range(len(self.items)):
      self.box_list.append(QCheckBox())
      self.box_list[i].setText(self.items[i])
      item = QListWidgetItem(q)
      q.setItemWidget(item, self.box_list[i])
      self.box_list[i].stateChanged.connect(self.show_selected)
    self.setLineEdit(self.text)
    self.setModel(q.model())
    self.setView(q)
  def get_selected(self) -> list:
    """
    get selected items
    :return:
    """
    ret = []
    for i in range(len(self.items)):
      if self.box_list[i].isChecked():
        ret.append(self.box_list[i].text())
    return ret
  def show_selected(self):
    """
    show selected items
    :return:
    """
    self.text.clear()
    ret = '; '.join(self.get_selected())
    self.text.setText(ret)

其中 show_selected() 用于显示被选中的内容,get_selected() 则用于获取所有被选中的内容并返回。

3.增加全选

要增加全选功能,首先是要在最前面加一个全选的选择框,然后为这个全选的选择框绑定相应的方法,用于实现全选功能和取消全选功能,具体代码如下:

def all_selected(self):
  """
  decide whether to check all
  :return:
  """
  # change state
  if self.state == 0:
    self.state = 1
    for i in range(1, len(self.items)):
      self.box_list[i].setChecked(True)
  else:
    self.state = 0
    for i in range(1, len(self.items)):
      self.box_list[i].setChecked(False)
  self.show_selected()

4.修改样式

由于默认的样式并不美观,所以我们可以对控件的样式进行自定义,例如字体大小、字体粗细等等,例如:

q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px") self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")

三、完整程序

完善后的下拉复选框的运行程序代码如下:

from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidgetItem, QListWidget, QCheckBox, \
  QApplication, QVBoxLayout, QWidget
import sys
class ComboCheckBox(QComboBox):
  def __init__(self, items: list):
    """
    initial function
    :param items: the items of the list
    """
    super(ComboCheckBox, self).__init__()
    self.items = ["全选"] + items # items list
    self.box_list = [] # selected items
    self.text = QLineEdit() # use to selected items
    self.state = 0 # use to record state
    q = QListWidget()
    for i in range(len(self.items)):
      self.box_list.append(QCheckBox())
      self.box_list[i].setText(self.items[i])
      item = QListWidgetItem(q)
      q.setItemWidget(item, self.box_list[i])
      if i == 0:
        self.box_list[i].stateChanged.connect(self.all_selected)
      else:
        self.box_list[i].stateChanged.connect(self.show_selected)
    q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px")
    self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")
    self.text.setReadOnly(True)
    self.setLineEdit(self.text)
    self.setModel(q.model())
    self.setView(q)
  def all_selected(self):
    """
    decide whether to check all
    :return:
    """
    # change state
    if self.state == 0:
      self.state = 1
      for i in range(1, len(self.items)):
        self.box_list[i].setChecked(True)
    else:
      self.state = 0
      for i in range(1, len(self.items)):
        self.box_list[i].setChecked(False)
    self.show_selected()
  def get_selected(self) -> list:
    """
    get selected items
    :return:
    """
    ret = []
    for i in range(1, len(self.items)):
      if self.box_list[i].isChecked():
        ret.append(self.box_list[i].text())
    return ret
  def show_selected(self):
    """
    show selected items
    :return:
    """
    self.text.clear()
    ret = '; '.join(self.get_selected())
    self.text.setText(ret)
class UiMainWindow(QWidget):
  def __init__(self):
    super(UiMainWindow, self).__init__()
    self.setWindowTitle('Test')
    self.resize(600, 400)
    combo = ComboCheckBox(["Python", "Java", "Go", "C++", "JavaScript", "PHP"])
    layout = QVBoxLayout()
    layout.addWidget(combo)
    self.setLayout(layout)
if __name__ == "__main__":
  app = QApplication(sys.argv)
  ui = UiMainWindow()
  ui.show()
  sys.exit(app.exec_())

总结

到此这篇关于自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码的文章就介绍到这了,更多相关PyQt5 下拉复选框 ComboCheckBox内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基于Django的ModelForm组件(详解)
Dec 07 Python
儿童学习python的一些小技巧
May 27 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
解决Keras 自定义层时遇到版本的问题
Jun 16 Python
简单的Python人脸识别系统
Jul 14 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
用python写PDF转换器的实现
Oct 29 Python
python安装第三方库如xlrd的方法
Oct 31 Python
Python 多线程处理任务实例
Nov 07 Python
动态设置django的model field的默认值操作步骤
Mar 30 #Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 #Python
django 实现手动存储文件到model的FileField
Mar 30 #Python
解决django FileFIELD的编码问题
Mar 30 #Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 #Python
Django 删除upload_to文件的步骤
Mar 30 #Python
python with语句的原理与用法详解
Mar 30 #Python
You might like
PHP setcookie() cannot modify header information 的解决方法
2009/01/09 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
python多进程使用函数封装实例
2020/05/02 Python
Python调用C/C++的方法解析
2020/08/05 Python
python创建文本文件的简单方法
2020/08/30 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
小学生竞选班干部演讲稿
2014/04/24 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
Linux系统下安装PHP7.3版本
2021/06/26 PHP