class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") self.widget = QCheckBox("This is a checkboxA") self.widget.setCheckState(Qt.Checked) self.widget.setTristate(True) self.widget.stateChanged.connect(self.show_state) self.setCentralWidget(self.widget) def show_state(self, s): print(s == Qt.Checked, s) print(self.widget.isTristate())
class ParentTreeItemWidget(QFrame): def __init__(self, text, item): QWidget.__init__(self) self.setMouseTracking(True) self.text = text self.item = item self.label = QLabel() self.checkBox = QCheckBox("") self.checkBox.setTristate(True) self.checkBox.stateChanged.connect(self.check_box_state_changed) layout = QHBoxLayout() layout.setMargin(0) layout.addWidget(self.checkBox) layout.addWidget(self.label) layout.addStretch() self.setLayout(layout) def check_box_state_changed(self): total = self.item.childCount() if self.checkBox.isTristate(): self.checkBox.setTristate(False) self.checkBox.setChecked(False) else: for i in range(total): w = self.item.treeWidget().itemWidget(self.item.child(i), 0) w.setChecked(self.checkBox.isChecked(), False) self.item.treeWidget().quadsSelectionChanged.emit() def update_name_and_checkbox(self): selected = 0 total = self.item.childCount() for i in range(total): w = self.item.treeWidget().itemWidget(self.item.child(i), 0) if w.isSelected(): selected += 1 self.label.setText( f"<b>{self.text} - {selected} of {total} selected</b>") self.checkBox.blockSignals(True) if selected == total: self.checkBox.setTristate(False) self.checkBox.setCheckState(Qt.Checked) elif selected == 0: self.checkBox.setTristate(False) self.checkBox.setCheckState(Qt.Unchecked) else: self.checkBox.setTristate(True) self.checkBox.setCheckState(Qt.PartiallyChecked) self.checkBox.blockSignals(False)
class MyWindow(QWidget): def __init__(self): super(MyWindow, self).__init__() self.initGUI("PyQt5 学习 QCheckBox") layout = QGridLayout() self.setLayout(layout) self.checkbox1 = QCheckBox("Kestrel") self.checkbox1.setToolTip("什么意思") # FIXME: 为什么不能显示 WhatsThis? self.checkbox1.setWhatsThis("帮助文档也解决不了这个问题") self.checkbox1.setChecked(True) self.checkbox1.toggled.connect(self.checkbox_toggled) layout.addWidget(self.checkbox1, 0, 0) self.checkbox2 = QCheckBox("Sparrowhawk") self.checkbox2.setWhatsThis("帮助文档:看起来像是什么老鹰") self.checkbox2.toggled.connect(self.checkbox_toggled) layout.addWidget(self.checkbox2, 1, 0) self.checkbox3 = QCheckBox("Hobby") self.checkbox3.setToolTip("兴趣爱好") self.checkbox3.toggled.connect(self.checkbox_toggled) layout.addWidget(self.checkbox3, 2, 0) layout2 = QBoxLayout(QBoxLayout.TopToBottom) layout.addLayout(layout2, 0, 1) layout.setHorizontalSpacing(5) self.checkbox4 = QCheckBox("Sex") self.checkbox4.setToolTip("三态复选框") self.checkbox4.setTristate(True) self.checkbox4.setCheckState(True) self.checkbox4.toggled.connect(self.checkbox_toggled) self.checkbox4.clicked.connect(self.on_clicked) layout2.addWidget(self.checkbox4) self.checkbox5 = QCheckBox("Age") self.checkbox5.setToolTip("两态复选框") self.checkbox5.setTristate(False) self.checkbox5.setChecked(True) self.checkbox5.toggled.connect(self.checkbox_toggled) layout2.addWidget(self.checkbox5) self.btn = QPushButton("Click Me") self.btn.setWhatsThis("点击我呀笨蛋") layout2.addSpacing(10) layout2.addWidget(self.btn) def on_clicked(self): """ 三态复选框最好使用 clicked() 信号,因为它能检查到 Qt.Checked 值, 而 checkbox_toggled() 信号用 Qt.PartiallyChecked 覆盖了 Qt.Checked 事件 """ if self.checkbox4.checkState() == Qt.PartiallyChecked: print("按钮4 -- 三态复选框 -- 部分选中了") elif self.checkbox4.checkState() == Qt.Unchecked: print("按钮4 -- 三态复选框 -- 取消选中") elif self.checkbox4.checkState() == Qt.Checked: print("按钮4 -- 三态复选框 -- 选中了") def checkbox_toggled(self): selected = [] print("\n") if self.checkbox1.isChecked(): selected.append(self.checkbox1.text()) if self.checkbox2.isChecked(): selected.append(self.checkbox2.text()) if self.checkbox3.isChecked(): selected.append(self.checkbox3.text()) if self.checkbox4.isTristate(): if self.checkbox4.checkState() == Qt.PartiallyChecked: print("按钮4 -- 三态复选框 -- 部分选中了") elif self.checkbox4.checkState() == Qt.Unchecked: print("按钮4 -- 三态复选框 -- 取消选中") elif self.checkbox4.checkState() == Qt.Checked: print("按钮4 -- 三态复选框 -- 选中了") if self.checkbox5.isTristate(): print("按钮5 -- 三态") else: if self.checkbox5.isChecked(): print("按钮5 -- 非三态 -- 选中") else: print("按钮5 -- 非三态 -- 未选中") print("Selected: %s" % (" ".join(selected))) def initGUI(self, title): """ 设置窗口大小和位置,以及标题 """ startx = 800 starty = 400 width = 480 height = 320 self.setGeometry(startx, starty, width, height) self.setWindowTitle(title)