最近用pyqt5写了一个客户端工具,需要到下拉复选框的效果,但是自带的没有提供,经网上查到以下ComboCheckBox 类可以实现; 主要是下拉单选和复选框的结合,继承了 QComboBox 类,实例化 ComboCheckBox 即可实现下拉复选框。

代码如下:
from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidget, QCheckBox, QListWidgetItem
class ComboCheckBox(QComboBox):
def loadItems(self, items):
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(0, self.row_num):
self.addQCheckBox(i)
self.qCheckBox[i].stateChanged.connect(self.showMessage)
self.setModel(self.qListWidget.model())
self.setView(self.qListWidget)
self.setLineEdit(self.qLineEdit)
# self.qLineEdit.textChanged.connect(self.printResults)
def showPopup(self):
# 重写showPopup方法,避免下拉框数据多而导致显示不全的问题
select_list = self.Selectlist() # 当前选择数据
self.loadItems(items=self.items[1:]) # 重新添加组件
for select in select_list:
index = self.items[:].index(select)
self.qCheckBox[index].setChecked(True) # 选中组件
return QComboBox.showPopup(self)
def printResults(self):
list = self.Selectlist()
print(list)
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 showMessage(self):
Outputlist = self.Selectlist()
self.qLineEdit.setReadOnly(False)
self.qLineEdit.clear()
show = ';'.join(Outputlist)
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)
def currentText(self):
text = QComboBox.currentText(self).split(';')
if text.__len__() == 1:
if not text[0]:
return []
else:
return "('{}')".format("','".join(text))
else:
return "('{}')".format("','".join(text))
if __name__ == '__main__':
from PyQt5 import QtWidgets,QtCore
import sys
items = ['Python', 'R', 'Java', 'C++', 'CSS']
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
comboBox1 = ComboCheckBox(Form)
comboBox1.setGeometry(QtCore.QRect(10, 10, 100, 20))
comboBox1.setMinimumSize(QtCore.QSize(100, 20))
comboBox1.loadItems(items)
Form.show()
sys.exit(app.exec_())
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
555
(select 198766*667891 from DUAL)
(select 198766*667891)
@@kSxSL
555����%2527%2522\'\"
555'"
555
555'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'
555*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)
5551HAodlrK')) OR 445=(SELECT 445 FROM PG_SLEEP(15))--
555lQKtBcUY') OR 919=(SELECT 919 FROM PG_SLEEP(15))--
555oNNCCJnf' OR 479=(SELECT 479 FROM PG_SLEEP(15))--
555-1)) OR 786=(SELECT 786 FROM PG_SLEEP(15))--
555-1) OR 998=(SELECT 998 FROM PG_SLEEP(15))--
555-1 OR 353=(SELECT 353 FROM PG_SLEEP(15))--
555UGiKIpbU'
555-1 waitfor delay '0:0:15' --
555-1)
555-1
(select(0)from(select(sleep(15)))v)/*'+(select(0)from(select(sleep(15)))v)+'"+(select(0)from(select(sleep(15)))v)+"*/
5550"XOR(555*if(now()=sysdate(),sleep(15),0))XOR"Z
5550'XOR(555*if(now()=sysdate(),sleep(15),0))XOR'Z
555*if(now()=sysdate(),sleep(15),0)
-1" OR 5*5=25 or "fd4SHDwL"="
-1' OR 5*5=25 or 'kv9K1bgM'='
-1" OR 5*5=25 --
-1' OR 5*5=25 --
-1 OR 5*5=25
-1 OR 5*5=25 --
555
555
555
怎么获取数据?在mian里直接调用selectlist()获取不到数据是怎么回事?