自定义实现 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 中,具体代码如下:

1 class ComboCheckBox(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 in range(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 in range(len(self.items)): 32 if self.box_list[i].isChecked(): 33 ret.append(self.box_list[i].text()) 34 return ret 35 36 def show_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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypfxy.html