PyQt5 – 在一组复选框中选择任何一个复选框

  • Post category:Python

下面是Python PyQt5中在一组复选框中选择任何一个复选框的完整使用攻略。

1. 安装PyQt5

在使用PyQt5之前,需要先安装PyQt5库。

通过pip安装:

pip install PyQt5

2. 创建复选框

使用QtWidgets模块中的QCheckBox类来创建复选框。

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

class Checkboxes(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        cb1 = QCheckBox('Checkbox 1', self)
        cb1.move(20, 20)
        cb1.toggle()

        cb2 = QCheckBox('Checkbox 2', self)
        cb2.move(20, 40)

在这个例子中,我们使用了两个QCheckBox对象(cb1和cb2)创建了两个复选框。

3. 组合复选框

为了实现任何一个复选框都可以被选择,需要将它们组合在一起。

使用QVBoxLayout类将复选框组合在一起,并设置复选框之间的间距。

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

class Checkboxes(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        vbox = QVBoxLayout()

        cb1 = QCheckBox('Checkbox 1', self)
        cb1.toggle()

        cb2 = QCheckBox('Checkbox 2', self)

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

        vbox.addStretch(1)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Checkboxes')
        self.show()

4. 添加事件处理函数

为了实现当任何一个复选框被选择时,其他复选框都不被选择,需要添加事件处理函数。

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

class Checkboxes(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        vbox = QVBoxLayout()

        cb1 = QCheckBox('Checkbox 1', self)
        cb1.toggle()
        cb1.stateChanged.connect(lambda:self.checkstate(cb1))

        cb2 = QCheckBox('Checkbox 2', self)
        cb2.stateChanged.connect(lambda:self.checkstate(cb2))

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

        vbox.addStretch(1)

        self.setLayout(vbox)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Checkboxes')
        self.show()


    def checkstate(self, checkbox):

        if checkbox.isChecked():
            for cb in self.findChildren(QCheckBox):
                if cb != checkbox:
                    cb.setChecked(False)

在这个事件处理函数checkstate中,当复选框被选择时,它会查找所有的QCheckBox,并将checkbox以外的所有其他QCheckBox设置为未选择状态。

示例1

下面这个示例演示了在一个QGroupBox内创建一个QCheckBox列表的过程:

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

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox = QVBoxLayout()

        groupbox = QGroupBox('Checkbox Example', self)
        groupbox.setLayout(vbox)

        vbox.addWidget(QCheckBox('Checkbox 1', self))
        vbox.addWidget(QCheckBox('Checkbox 2', self))
        vbox.addWidget(QCheckBox('Checkbox 3', self))
        vbox.addWidget(QCheckBox('Checkbox 4', self))
        vbox.addWidget(QCheckBox('Checkbox 5', self))

        vbox.addStretch(1)

        layout = QVBoxLayout()
        layout.addWidget(groupbox)

        self.setLayout(layout)
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Checkbox Example')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在这个示例中,我们首先创建了一个QGroupBox,然后在它内部使用QVBoxLayout添加了一系列QCheckBox。

示例2

下面这个示例演示了如何在多个QGroupBox中的QCheckBox之间实现互斥选择的过程:

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

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        vbox1 = QVBoxLayout()

        groupbox1 = QGroupBox('Set 1', self)
        groupbox1.setLayout(vbox1)

        vbox1.addWidget(QCheckBox('Checkbox 1', self))
        vbox1.addWidget(QCheckBox('Checkbox 2', self))
        vbox1.addWidget(QCheckBox('Checkbox 3', self))
        vbox1.addWidget(QCheckBox('Checkbox 4', self))
        vbox1.addWidget(QCheckBox('Checkbox 5', self))

        vbox2 = QVBoxLayout()

        groupbox2 = QGroupBox('Set 2', self)
        groupbox2.setLayout(vbox2)

        vbox2.addWidget(QCheckBox('Checkbox 6', self))
        vbox2.addWidget(QCheckBox('Checkbox 7', self))
        vbox2.addWidget(QCheckBox('Checkbox 8', self))
        vbox2.addWidget(QCheckBox('Checkbox 9', self))
        vbox2.addWidget(QCheckBox('Checkbox 10', self))

        hbox = QHBoxLayout()
        hbox.addWidget(groupbox1)
        hbox.addWidget(groupbox2)

        self.setLayout(hbox)

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Checkbox Example')
        self.show()

        for groupbox in (groupbox1, groupbox2):
            for checkbox in groupbox.findChildren(QCheckBox):
                checkbox.stateChanged.connect(lambda:self.checkstate(groupbox, checkbox))

    def checkstate(self, groupbox, checkbox):

        if checkbox.isChecked():
            for cb in groupbox.findChildren(QCheckBox):
                if cb != checkbox:
                    cb.setChecked(False)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在这个示例中,我们首先创建了两个QGroupBox,然后在它们内部使用QVBoxLayout添加了一系列QCheckBox。

在初始化阶段中,我们使用groupbox1.findChildren和groupbox2.findChildren查找所有的QCheckBox并连接到checkstate事件处理函数中。

在checkstate事件处理函数中,我们会将除了触发该事件的QCheckBox以外的所有其它QCheckBox设置为未选择状态。