复选下拉框
1.界面
2.界面转ui
python -m PyQt5.uic.pyuic box_ui.ui -o box_ui.py
界面代码
"""
box_ui.py
"""
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(321, 226)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setObjectName("comboBox")
self.verticalLayout.addWidget(self.comboBox)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 321, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "复选下拉框"))
3. 复选下拉框代码
class ComboCheckBox(QComboBox):
def __init__(self, items: list):
super(ComboCheckBox, self).__init__()
self.items = ["全选"] + items
self.box_list = []
self.text = QLineEdit()
self.state = 0
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: 20px; font-weight: bold; height: 40px; margin-left: 5px")
# self.setStyleSheet("width: 300px; height: 50px; font-size: 21px; font-weight: bold")
self.text.setReadOnly(True)
self.setLineEdit(self.text)
self.setModel(q.model())
self.setView(q)
def all_selected(self):
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 set_selected(self, selected_list):
for i in range(1, len(self.items)):
self.box_list[i].setChecked(False)
for item in selected_list:
for i in range(1, len(self.items)):
if self.box_list[i].text() == item:
self.box_list[i].setChecked(True)
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)
4.使用
class MyWindow(Ui_MainWindow):
def setupUi(self, MainWindow):
super().setupUi(MainWindow)
self.verticalLayout.removeWidget(self.comboBox)
#self.horizontalLayout.removeWidget(self.comboBox)
combo = ComboCheckBox(["A", "B","C","D" ])
combo.parent = self.centralwidget
self.comboBox = combo
self.comboBox.setObjectName("comboBox")
self.verticalLayout.addWidget(self.comboBox)
# self.horizontalLayout.addWidget(self.comboBox)
class MyMainWindow(QMainWindow, MyWindow):
def __init__(self, *args, **kwargs):
super(MyMainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
self.show()
self.do_signal_slots()
def do_signal_slots(self):
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
myMainWindow = MyMainWindow()
sys.exit(app.exec_())