PyQt5 – 复选框的检查状态取决于另一个复选框

  • Post category:Python

PyQt5是一个Python的GUI库,它可以用于开发桌面应用程序。其中之一的功能是实现复选框的检查状态取决于另一个复选框。下面是详细的使用攻略:

1. 准备工作

首先,需要在电脑上安装PyQt5库。可以使用pip命令进行安装,如下所示:

pip install PyQt5

2. 创建两个复选框

在PyQt5中,使用QCheckBox类来创建复选框。创建两个复选框的代码如下所示:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()

        cb1 = QCheckBox('复选框1', self)
        cb2 = QCheckBox('复选框2', self)

        vbox.addWidget(cb1)
        vbox.addWidget(cb2)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('复选框的检查状态取决于另一个复选框')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    sys.exit(app.exec_())

运行上述代码会得到一个窗口界面,其中包含两个复选框。

3. 设置复选框状态

可以使用setChecked()方法来设置复选框的状态,如下所示:

cb1.setChecked(True)  # 设置复选框1为选中状态
cb2.setChecked(False)  # 设置复选框2为未选中状态

4. 监听复选框状态

要实现复选框的检查状态取决于另一个复选框,需要监听复选框的状态。在PyQt5中,可以使用stateChanged信号来监听复选框状态的变化。下面是具体的实现代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()

        cb1 = QCheckBox('复选框1', self)
        cb2 = QCheckBox('复选框2', self)

        vbox.addWidget(cb1)
        vbox.addWidget(cb2)

        self.setLayout(vbox)

        cb1.stateChanged.connect(self.cb1StateChanged)  # 绑定复选框1的状态变化信号到槽函数cb1StateChanged
        cb2.stateChanged.connect(self.cb2StateChanged)  # 绑定复选框2的状态变化信号到槽函数cb2StateChanged

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('复选框的检查状态取决于另一个复选框')
        self.show()

    def cb1StateChanged(self, state):
        if state == 2:  # 如果复选框1被选中
            cb2 = self.findChild(QCheckBox, '复选框2')  # 找到名为“复选框2”的复选框
            cb2.setChecked(False)  # 设置复选框2为未选中状态

    def cb2StateChanged(self, state):
        if state == 2:  # 如果复选框2被选中
            cb1 = self.findChild(QCheckBox, '复选框1')  # 找到名为“复选框1”的复选框
            cb1.setChecked(False)  # 设置复选框1为未选中状态


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    sys.exit(app.exec_())

运行上述代码会得到一个窗口界面,其中包含两个复选框。当选中其中一个复选框时,另一个复选框将被设置为未选中状态。

示例1:订单商品是否含税

假设我们正在开发一个订单管理系统,并且需要界面上包含一个复选框来选择订单商品是否含税。如果订单商品含税,另一个复选框将被设置为未选中状态。这种场景下,可以使用上述的监测复选框状态的方法来实现。代码示例如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()

        cb1 = QCheckBox('含税', self)
        cb2 = QCheckBox('不含税', self)

        vbox.addWidget(cb1)
        vbox.addWidget(cb2)

        self.setLayout(vbox)

        cb1.stateChanged.connect(self.cb1StateChanged)
        cb2.stateChanged.connect(self.cb2StateChanged)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('订单管理系统')
        self.show()

    def cb1StateChanged(self, state):
        if state == 2:
            cb2 = self.findChild(QCheckBox, '不含税')
            cb2.setChecked(False)

    def cb2StateChanged(self, state):
        if state == 2:
            cb1 = self.findChild(QCheckBox, '含税')
            cb1.setChecked(False)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    sys.exit(app.exec_())

运行上述代码会得到一个窗口界面,其中包含两个复选框。当选中“含税”复选框时,“不含税”复选框将被设置为未选中状态;当选中“不含税”复选框时,“含税”复选框将被设置为未选中状态。

示例2:加减乘除的互斥

假设我们需要设计一个简单的计算器界面,其中有四个复选框来选择加减乘除算法。为了避免用户同时选择了两个或多个算法,我们需要监听复选框状态的变化并控制它们之间的互斥关系。代码示例如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()

        cb1 = QCheckBox('加法', self)
        cb2 = QCheckBox('减法', self)
        cb3 = QCheckBox('乘法', self)
        cb4 = QCheckBox('除法', self)

        vbox.addWidget(cb1)
        vbox.addWidget(cb2)
        vbox.addWidget(cb3)
        vbox.addWidget(cb4)

        self.setLayout(vbox)

        cb1.stateChanged.connect(self.cb1StateChanged)
        cb2.stateChanged.connect(self.cb2StateChanged)
        cb3.stateChanged.connect(self.cb3StateChanged)
        cb4.stateChanged.connect(self.cb4StateChanged)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('简单计算器')
        self.show()

    def cb1StateChanged(self, state):
        if state == 2:
            self.setExclusion('加法')

    def cb2StateChanged(self, state):
        if state == 2:
            self.setExclusion('减法')

    def cb3StateChanged(self, state):
        if state == 2:
            self.setExclusion('乘法')

    def cb4StateChanged(self, state):
        if state == 2:
            self.setExclusion('除法')

    def setExclusion(self, cbName):
        for name in ['加法', '减法', '乘法', '除法']:
            if name != cbName:
                cb = self.findChild(QCheckBox, name)
                cb.setChecked(False)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    sys.exit(app.exec_())

运行上述代码会得到一个窗口界面,其中包含四个复选框。当选中其中一个复选框时,其他复选框将被设置为未选中状态。