下面是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设置为未选择状态。