Esempio n. 1
0
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())
Esempio n. 2
0
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)
Esempio n. 3
0
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)