笔者在用PyQt5写GUI时碰到了需要使用下拉式复选框的情况,但是PyQt5中没有相应的组件,而网上找到的方法大多是qt使用的,所以不能直接拿来用。
没办法,在这种让人无奈的情况下,笔者只能根据网上大神们的方法试着自己写一个喽。
你还别说,真就让我写出来了。(笔者是个菜鸟新手,所以这小小的成功让我很开心)
然后笔者就很严肃地将这个组件命名为QComboCheckBox,也就是QComboBox和QCheckBox的拼接。
废话不多说,直接先上效果图:
然后是代码:(第一个是基础,第二个是带全选和清空功能)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
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的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/LJX4ever/article/details/78039318