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_())