#pyqt5 带有复选框的可多选的Combox#
## 扩展字 QCombox
案例截图

## 代码
from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidgetItem, QListWidget, QCheckBox, \
QApplication, QVBoxLayout, QWidget, QPushButton
import sys
# Ctrl+Alt+L 自动格式化代码
"""
# 多选Combox框1
class ComboCheckBox(QComboBox):
def __init__(self, items: list):
super(ComboCheckBox, self).__init__()
self.items = ["全选"] + items # items list
self.box_list = [] # selected items
self.text = QLineEdit() # use to selected items
self.state = 0 # use to record state
q = QListWidget()
for i in range(len(self.items)):
self.box_list.append(QCheckBox())
self.box_list[i].setText(self.items[i])
item = QListWidgetItem(q)
q.setItemWidget(item, self.box_list[i])
if i == 0:
self.box_list[i].stateChanged.connect(self.all_selected)
else:
self.box_list[i].stateChanged.connect(self.show_selected)
q.setStyleSheet("font-size: 18px; height: 35px; margin-left: 5px") # font-weight: bold;
self.setStyleSheet("width: 300px; height: 35px; font-size: 20px;")
self.text.setReadOnly(True)
self.setLineEdit(self.text)
self.setModel(q.model())
self.setView(q)
def all_selected(self):
# change state
if self.state == 0:
self.state = 1
for i in range(1, len(self.items)):
self.box_list[i].setChecked(True)
else:
self.state = 0
for i in range(1, len(self.items)):
self.box_list[i].setChecked(False)
self.show_selected()
def get_selected(self):
ret = []
for i in range(1, len(self.items)):
if self.box_list[i].isChecked():
ret.append(self.box_list[i].text())
return ret
def show_selected(self):
self.text.clear()
ret = '; '.join(self.get_selected())
self.text.setText(ret)
class UiMainWindow(QWidget):
def __init__(self):
super(UiMainWindow, self).__init__()
self.setWindowTitle('Test')
self.resize(600, 400)
combo = ComboCheckBox(["Python", "Java", "Go", "C++", "JavaScript", "PHP"])
layout = QVBoxLayout()
layout.addWidget(combo)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
ui = UiMainWindow()
ui.show()
sys.exit(app.exec_())
"""
# from PyQt5.QtWidgets import QComboBox, QLineEdit, QListWidget, QCheckBox, QListWidgetItem
# # 多选Combox框2
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 []
return 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)
searchBtn = QPushButton(Form)
searchBtn.clicked.connect(lambda:print(comboBox1.currentText()))
Form.show()
sys.exit(app.exec_())

1604

被折叠的 条评论
为什么被折叠?



