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

摘要:
QtWidgets.QcomboBox.setLineEdit:设置组合框使用的行,而不是当前行编辑窗口小部件。QtWidgets.QListWidget.setItemWidget:设置要在给定的item中的widget组件。

一、前言

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

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

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

二、代码实现

1.主要方法

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

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

2.具体代码

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

1 classComboCheckBox(QComboBox):
2     def __init__(self, items: list):
3         """
4 initial function
5 :param items: the items of the list
6         """
7         super(ComboCheckBox, self).__init__()
8         self.items = items  #items list
9         self.box_list = []  #selected items
10         self.text = QLineEdit()  #use to selected items
11 self.text.setReadOnly(True)
12 
13         q =QListWidget()
14         for i inrange(len(self.items)):
15 self.box_list.append(QCheckBox())
16 self.box_list[i].setText(self.items[i])
17             item =QListWidgetItem(q)
18 q.setItemWidget(item, self.box_list[i])
19 self.box_list[i].stateChanged.connect(self.show_selected)
20 
21 self.setLineEdit(self.text)
22 self.setModel(q.model())
23 self.setView(q)
24 
25     def get_selected(self) ->list:
26         """
27 get selected items
28 :return:
29         """
30         ret =[]
31         for i inrange(len(self.items)):
32             ifself.box_list[i].isChecked():
33 ret.append(self.box_list[i].text())
34         returnret
35 
36     defshow_selected(self):
37         """
38 show selected items
39 :return:
40         """
41 self.text.clear()
42         ret = '; '.join(self.get_selected())
43         self.text.setText(ret)

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

3.增加全选

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

1 defall_selected(self):
2     """
3 decide whether to check all
4 :return:
5     """
6     #change state
7     if self.state ==0:
8         self.state = 1
9         for i in range(1, len(self.items)):
10 self.box_list[i].setChecked(True)
11     else:
12         self.state =0
13         for i in range(1, len(self.items)):
14 self.box_list[i].setChecked(False)
15     self.show_selected()

4.修改样式

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

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

三、完整程序

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

1 from PyQt5.QtWidgets importQComboBox, QLineEdit, QListWidgetItem, QListWidget, QCheckBox, 
2 QApplication, QVBoxLayout, QWidget
3 importsys
4 
5 
6 classComboCheckBox(QComboBox):
7     def __init__(self, items: list):
8         """
9 initial function
10 :param items: the items of the list
11         """
12         super(ComboCheckBox, self).__init__()
13         self.items = ["全选"] + items  #items list
14         self.box_list = []  #selected items
15         self.text = QLineEdit()  #use to selected items
16         self.state = 0  #use to record state
17 
18         q =QListWidget()
19         for i inrange(len(self.items)):
20 self.box_list.append(QCheckBox())
21 self.box_list[i].setText(self.items[i])
22             item =QListWidgetItem(q)
23 q.setItemWidget(item, self.box_list[i])
24             if i ==0:
25 self.box_list[i].stateChanged.connect(self.all_selected)
26             else:
27 self.box_list[i].stateChanged.connect(self.show_selected)
28 
29         q.setStyleSheet("font-size: 20px; font-weight: bold; height: 40px; margin-left: 5px")
30         self.setStyleSheet("300px; height: 50px; font-size: 21px; font-weight: bold")
31 self.text.setReadOnly(True)
32 self.setLineEdit(self.text)
33 self.setModel(q.model())
34 self.setView(q)
35 
36     defall_selected(self):
37         """
38 decide whether to check all
39 :return:
40         """
41         #change state
42         if self.state ==0:
43             self.state = 1
44             for i in range(1, len(self.items)):
45 self.box_list[i].setChecked(True)
46         else:
47             self.state =0
48             for i in range(1, len(self.items)):
49 self.box_list[i].setChecked(False)
50 self.show_selected()
51 
52     def get_selected(self) ->list:
53         """
54 get selected items
55 :return:
56         """
57         ret =[]
58         for i in range(1, len(self.items)):
59             ifself.box_list[i].isChecked():
60 ret.append(self.box_list[i].text())
61         returnret
62 
63     defshow_selected(self):
64         """
65 show selected items
66 :return:
67         """
68 self.text.clear()
69         ret = '; '.join(self.get_selected())
70 self.text.setText(ret)
71 
72 
73 classUiMainWindow(QWidget):
74     def __init__(self):
75         super(UiMainWindow, self).__init__()
76         self.setWindowTitle('Test')
77         self.resize(600, 400)
78         combo = ComboCheckBox(["Python", "Java", "Go", "C++", "JavaScript", "PHP"])
79         layout =QVBoxLayout()
80 layout.addWidget(combo)
81 self.setLayout(layout)
82 
83 
84 if __name__ == "__main__":
85     app =QApplication(sys.argv)
86     ui =UiMainWindow()
87 ui.show()
88     sys.exit(app.exec_())

免责声明:文章转载自《自定义实现 PyQt5 下拉复选框 ComboCheckBox》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js 控制按钮点击后不可用Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pyQt5简单使用

安装 pip install PyQt5 pip3.5 install pyqt5-tools  界面化操作 1.在win+R中输入designer并敲回车,即可启动Designer。一般选择“Main Window”点击“Create”即可创建。 若在win+R中输入designer并敲回车后无反应,可以直接搜designer.exe直接启动    2....

QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

今天介绍一下一个小东西 — 如何让QComboBox实现复选功能? 需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget +QListWidgetItem Model/View + QItemDelegate...

Python——GUI编程 控件及常用信号

QSlider类中的常用信号 valueChanged: 当滑块位置发生改变时触发此信号 sliderPressed: 当用户按下滑块时触发此信号 sliderMoved: 当用户拖动滑块时触发此信号 sliderReleased: 当用户释放滑块时触发此信号 QCmoboBox类中的常用信号 Activated: 当用户选中一个下拉选项时触发该信号cur...

vue实现CheckBox与数组对象绑定

实现需求: 实现一个简易的购物车,页面的表格展示data数据中的一个数组对象,并提供选中商品和全选商品checkbox复选框,页面实时显示选中商品的总金额: 分析: 1:使用v-for循环渲染arraylist对象; 2:使用computed计算属性计算总价; 3:使用computed计算全选复选框是否应该被选中(商品列表如果都被勾选,则设置全选复选框的...

基于pyqt的电子时钟

基于pyqt的电子时钟 介绍 通过电子时钟完成了基于pyqt的一个综合项目,其中包括UI界面与逻辑代码分离设计的思想,更新界面在主线程中完成,逻辑代码在子线程中完成。子线程的处理结果通过信号发送给主线程进行更新界面。子线程通过继承主线程来访问主线程的共享资源,主线程通过对象方法来访问子线程的资源。涉及多线程和线程休眠与唤醒等功能。 软件架构 操作系统...

wxpython 基本的控件 (按钮)

使用按钮工作 在wxPython 中有很多不同类型的按钮。这一节,我们将讨论文本按钮、位图按钮、开关按钮(toggle buttons )和通用(generic )按钮。   如何生成一个按钮? 在第一部分(part 1)中,我们已经说明了几个按钮的例子,所以这里我们只简短的涉及它的一些基本的东西。图7.4显示了一个简单的按钮。   图7.4 使用按钮...