笔者在用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