3. QPushButton按钮的点击事件处理
任务目标
创建三个按钮,分别点击后将主窗口背景色切换为红色、绿色和蓝色。通过本案例掌握QPushButton的clicked信号与槽函数连接的两种方式:connect函数连接自定义槽,以及使用QSignalMapper(或lambda表达式)传递按钮标识。
环境依赖
- Python 3.6+
- PyQt5 或 PySide2(本案例代码基于PyQt5编写,若使用PySide2,只需将导入语句中的
PyQt5替换为PySide2即可)
完整实现代码
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor
class ColorChangeWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QPushButton点击事件示例")
self.setFixedSize(300, 200)
# 创建三个按钮
self.btn_red = QPushButton("红色", self)
self.btn_green = QPushButton("绿色", self)
self.btn_blue = QPushButton("蓝色", self)
# 布局
layout = QVBoxLayout(self)
layout.addWidget(self.btn_red)
layout.addWidget(self.btn_green)
layout.addWidget(self.btn_blue)
# 方式一:connect连接自定义槽函数
self.btn_red.clicked.connect(self.change_to_red)
self.btn_green.clicked.connect(self.change_to_green)
self.btn_blue.clicked.connect(self.change_to_blue)
# 方式二:使用lambda表达式传递参数(等效实现,二选一即可)
# self.btn_red.clicked.connect(lambda: self.change_color("red"))
# self.btn_green.clicked.connect(lambda: self.change_color("green"))
# self.btn_blue.clicked.connect(lambda: self.change_color("blue"))
# 三个独立的槽函数
def change_to_red(self):
self.setStyleSheet("background-color: #FF0000;")
def change_to_green(self):
self.setStyleSheet("background-color: #00FF00;")
def change_to_blue(self):
self.setStyleSheet("background-color: #0000FF;")
# 使用参数的统一槽函数(配合lambda使用)
# def change_color(self, color_name):
# color_map = {"red": "#FF0000", "green": "#00FF00", "blue": "#0000FF"}
# self.setStyleSheet(f"background-color: {color_map[color_name]};")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ColorChangeWindow()
window.show()
sys.exit(app.exec_())
运行方式
- 将上述代码保存为
button_color_demo.py。 - 在终端执行:
python button_color_demo.py。
验证方法
- 程序启动后,窗口默认显示系统背景色(通常为灰色)。
- 点击“红色”按钮,窗口背景立即变为红色(#FF0000)。
- 点击“绿色”按钮,窗口背景变为绿色(#00FF00)。
- 点击“蓝色”按钮,窗口背景变为蓝色(#0000FF)。
- 三个按钮本身仍保持默认外观,说明样式表只作用于窗口背景,验证通过。
关键说明
- 代码中提供了两种信号连接方式:方式一为每个按钮连接独立槽函数,直观但代码重复;方式二(注释部分)使用lambda表达式配合统一槽函数,更简洁。两种方式效果完全等价,实际开发中任选其一。
clicked信号在按钮被鼠标点击时发出,是QPushButton最常用的信号。若需区分多个按钮的点击来源,lambda传参或QSignalMapper是标准做法。- 使用
setStyleSheet改变背景色是最简实现。若需更精细的颜色控制,可改用QPalette,但本案例以信号槽演示为核心,故采用样式表方案。