QCheckBox 复选按钮
QCheckBox 是 PyQt6 里的复选按钮控件,这篇教学会介绍如何在 PyQt6 视窗里加入 QCheckBox 复选按钮,并进行一些基本的样式设定,以及进行按钮群组和点击事件的设定。
快速预览:
加入 QCheckBox 复选按钮
QCheckBox位置设置
QCheckBox 状态设定
QCheckBox 样式设定
QCheckBox 点击事件
加入 QCheckBox 复选按钮
建立 PyQt6 视窗物件后,透过 QtWidgets.QCheckBox(widget)
方法,就能在指定的控件中建立复选按钮,下方的程式码执行后,会加入三个 QCheckBox 按钮 ,并使用 setText() 方法加入文字。
from PyQt6 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() Form.setWindowTitle('千牛编程思维') Form.resize(300, 200) cb_a = QtWidgets.QCheckBox(Form) # 复选按钮 A cb_a.setGeometry(30, 60, 50, 20) cb_a.setText('A') cb_b = QtWidgets.QCheckBox(Form) # 复选按钮 B cb_b.setGeometry(80, 60, 50, 20) cb_b.setText('B') cb_c = QtWidgets.QCheckBox(Form) # 复选按钮 C cb_c.setGeometry(130, 60, 50, 20) cb_c.setText('C') Form.show() sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets import sys class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle('千牛编程思维') self.resize(300, 200) self.ui() def ui(self): self.cb_a = QtWidgets.QCheckBox(self) # 复选按钮 A self.cb_a.setGeometry(30, 60, 50, 20) self.cb_a.setText('A') self.cb_b = QtWidgets.QCheckBox(self) # 复选按钮 B self.cb_b.setGeometry(80, 60, 50, 20) self.cb_b.setText('B') self.cb_c = QtWidgets.QCheckBox(self) # 复选按钮 C self.cb_c.setGeometry(130, 60, 50, 20) self.cb_c.setText('C') if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = MyWidget() Form.show() sys.exit(app.exec())
QCheckBox位置设置
透过下列 QCheckBox 方法,可以将 QCheckBox 控件定位到指定的位置:
方法 | 参数 | 说明 |
---|---|---|
移动 | x, y | 设定 QCheckBox 在摆放的父控件中的 xy 坐标,x 往右为正,y 往下为正,尺寸根据内容自动延伸。 |
设置几何() | X,X,Y,W,H | 设定 QCheckBox 在摆放的父控件中的 xy 坐标和长宽尺寸,x 往右为正,y 往下为正,如果超过长宽尺寸,预设会被裁切无法显示。 |
下方的程式码执行后会放入四个 QCheckBox,两个使用 move() 定位,另外两个使用 setGeometry() 方法定位。
from PyQt6 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() Form.setWindowTitle('千牛编程思维') Form.resize(300, 200) cb_a = QtWidgets.QCheckBox(Form) # 复选按钮 A cb_a.move(30, 60) cb_a.setText('A') cb_b = QtWidgets.QCheckBox(Form) # 复选按钮 B cb_b.move(80, 60) cb_b.setText('B') cb_c = QtWidgets.QCheckBox(Form) # 复选按钮 C cb_c.setGeometry(130, 60, 50, 20) cb_c.setText('C') cb_d = QtWidgets.QCheckBox(Form) # 复选按钮 D cb_d.setGeometry(180, 60, 50, 20) cb_d.setText('D') Form.show() sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets import sys class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle('千牛编程思维') self.resize(300, 200) self.ui() def ui(self): self.cb_a = QtWidgets.QCheckBox(self) # 复选按钮 A self.cb_a.move(30, 60) self.cb_a.setText('A') self.cb_b = QtWidgets.QCheckBox(self) # 复选按钮 B self.cb_b.move(80, 60) self.cb_b.setText('B') self.cb_c = QtWidgets.QCheckBox(self) # 复选按钮 C self.cb_c.setGeometry(130, 60, 50, 20) self.cb_c.setText('C') self.cb_d = QtWidgets.QCheckBox(self) # 复选按钮 D self.cb_d.setGeometry(180, 60, 50, 20) self.cb_d.setText('D') if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = MyWidget() Form.show() sys.exit(app.exec())
QCheckBox 状态设定
透过下列几种方法,可以设定 QCheckBox 的状态:
方法 | 参数 | 说明 |
---|---|---|
设置已禁用() | 布尔 | 是否停用,预设 False 启用,可设定 True 停用。 |
已检查过() | 布尔 | 是否勾选,预设 False 不勾选,可设定 True 勾选,若同一组有多个勾选,则以最后一个为主。 |
切换开关 | 勾选状态切换。 |
下面的程式码执行后,QCheckBox B 会停用,QCheckBox A 会预先勾选。
from PyQt6 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() Form.setWindowTitle('千牛编程思维') Form.resize(300, 200) cb_a = QtWidgets.QCheckBox(Form) # 复选按钮 A cb_a.move(30, 60) cb_a.setText('A') cb_a.setChecked(True) # 预设选取 cb_b = QtWidgets.QCheckBox(Form) # 复选按钮 B cb_b.move(80, 60) cb_b.setText('B') cb_b.setDisabled(True) # 停用 cb_c = QtWidgets.QCheckBox(Form) cb_c.setGeometry(130, 60, 50, 20) cb_c.setText('C') Form.show() sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets import sys class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle('千牛编程思维') self.resize(300, 200) self.ui() def ui(self): self.cb_a = QtWidgets.QCheckBox(self) # 复选按钮 A self.cb_a.move(30, 60) self.cb_a.setText('A') self.cb_a.setChecked(True) # 预设选取 self.cb_b = QtWidgets.QCheckBox(self) # 复选按钮 B self.cb_b.move(80, 60) self.cb_b.setText('B') self.cb_b.setDisabled(True) # 停用 self.cb_c = QtWidgets.QCheckBox(self) self.cb_c.setGeometry(130, 60, 50, 20) self.cb_c.setText('C') if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = MyWidget() Form.show() sys.exit(app.exec())
QCheckBox 样式设定
如果会使用网页 CSS 语法,就能透过 setStyleSheet() 设定 QCheckBox 样式,在设计样式上也较为弹性好用,下方的程式码执行后,会套用 CSS 样式语法,将 QCheckBox 设定为蓝色字,当滑鼠移到按钮上,就会触发 hover 的样式而变成红色字,勾选之后就会变成黑底白字。
from PyQt6 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() Form.setWindowTitle('千牛编程思维') Form.resize(300, 200) # 設定 QCheckBox style = ''' QCheckBox { color: #00f; } QCheckBox:hover { color: #f00; } QCheckBox:checked { color: #fff; background: #000; } ''' cb_a = QtWidgets.QCheckBox(Form) cb_a.move(30, 60) cb_a.setText('A') cb_a.setStyleSheet(style) # 套用 style cb_b = QtWidgets.QCheckBox(Form) cb_b.move(80, 60) cb_b.setText('B') cb_b.setStyleSheet(style) # 套用 style cb_c = QtWidgets.QCheckBox(Form) cb_c.move(130, 60) cb_c.setText('C') cb_c.setStyleSheet(style) # 套用 style Form.show() sys.exit(app.exec())
class 写法:
from PyQt6 import QtWidgets import sys class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle('千牛编程思维') self.resize(300, 200) self.ui() def ui(self): # 設定 QCheckBox style = ''' QCheckBox { color: #00f; } QCheckBox:hover { color: #f00; } QCheckBox:checked { color: #fff; background: #000; } ''' self.cb_a = QtWidgets.QCheckBox(self) self.cb_a.move(30, 60) self.cb_a.setText('A') self.cb_a.setStyleSheet(style) # 套用 style self.cb_b = QtWidgets.QCheckBox(self) self.cb_b.move(80, 60) self.cb_b.setText('B') self.cb_b.setStyleSheet(style) # 套用 style self.cb_c = QtWidgets.QCheckBox(self) self.cb_c.move(130, 60) self.cb_c.setText('C') self.cb_c.setStyleSheet(style) # 套用 style if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = MyWidget() Form.show() sys.exit(app.exec())
QCheckBox 点击事件
如果要侦测勾选了哪个 QCheckBox,可以使用 clicked() 的方法,将函式与各个按钮绑定,接著就能透过 text() 取得按钮文字,透过 isChecked() 取得按钮勾选状态,下方的程式码执行后,勾选 QCheckBox 时,就会将勾选的按钮文字组合,透过 QLabel 输出显示。
from PyQt6 import QtWidgets import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() Form.setWindowTitle('千牛编程思维') Form.resize(300, 200) arr = ['']*3 # 用于存放文字 def show(cb, i): global a if cb.isChecked(): arr[i] = cb.text() else: arr[i] = '' output = ''.join(arr) label.setText(output) label = QtWidgets.QLabel(Form) label.setGeometry(30, 30, 100, 30) cb_a = QtWidgets.QCheckBox(Form) cb_a.move(30, 60) cb_a.setText('A') cb_a.clicked.connect(lambda:show(cb_a, 0)) cb_b = QtWidgets.QCheckBox(Form) cb_b.move(80, 60) cb_b.setText('B') cb_b.clicked.connect(lambda:show(cb_b, 1)) cb_c = QtWidgets.QCheckBox(Form) cb_c.move(130, 60) cb_c.setText('C') cb_c.clicked.connect(lambda:show(cb_c, 2)) Form.show() sys.exit(app.exec())
class 写法 ( 注意不能使用 show 作为方法名称,会覆写基类的 show 方法造成无法显示 ):
from PyQt6 import QtWidgets import sys class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle('千牛编程思维') self.resize(300, 200) self.ui() def ui(self): self.arr = ['']*3 # 定义一个长度为3的空列表 self.label = QtWidgets.QLabel(self) # 创建一个QLabel控件 self.label.setGeometry(30, 30, 100, 30) # 设置QLabel控件的位置和大小 self.cb_a = QtWidgets.QCheckBox(self) # 创建一个QCheckBox控件 self.cb_a.move(30, 60) # 设置QCheckBox控件的位置 self.cb_a.setText('A') # 设置QCheckBox控件的文本 self.cb_a.clicked.connect(lambda:self.showText(self.cb_a, 0)) self.cb_b = QtWidgets.QCheckBox(self) # 创建一个QCheckBox控件 self.cb_b.move(80, 60) # 设置QCheckBox控件的位置 self.cb_b.setText('B') # 设置QCheckBox控件的文本 self.cb_b.clicked.connect(lambda:self.showText(self.cb_b, 1)) self.cb_c = QtWidgets.QCheckBox(self) # 创建一个QCheckBox控件 self.cb_c.move(130, 60) # 设置QCheckBox控件的位置 self.cb_c.setText('C') # 设置QCheckBox控件的文本 self.cb_c.clicked.connect(lambda:self.showText(self.cb_c, 2)) # 定义一个showText方法,用于处理QCheckBox控件的点击事件 def showText(self, cb, i): if cb.isChecked(): # 如果QCheckBox控件被选中 self.arr[i] = cb.text() # 将对应的文本添加到列表中 else: self.arr[i] = '' # 如果QCheckBox控件被取消选中,则将对应的列表元素置为空字符串 output = ''.join(self.arr) # 将列表中的元素合并为一个字符串 self.label.setText(output) # 将合并后的字符串设置为QLabel控件的文本 if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) Form = MyWidget() Form.show() sys.exit(app.exec())