QPushButton 是 PyQt 和 PySide 这两个流行的 Python GUI 框架中一个非常核心和常用的控件,它是一个标准的按钮,用户可以点击它来触发某个操作或事件。

下面我将从以下几个方面进行详细说明:
- 基本概念
- 如何创建一个简单的按钮
- 核心功能:连接点击事件
- 常用属性和方法
- 进阶示例:带图标和工具提示的按钮
- 不同框架间的差异
基本概念
QPushButton 继承自 QAbstractButton,后者提供了按钮的基本功能,如点击、按下、释放等信号。QPushButton 在此基础上增加了外观上的定制能力,如文本、图标等。
在 PyQt 中,QPushButton 位于 PyQt5.QtWidgets 模块。
在 PySide 中,QPushButton 位于 PySide6.QtWidgets 模块。
如何创建一个简单的按钮
你需要安装相应的库,如果你选择 PyQt:

pip install PyQt5
如果你选择 PySide(现在是官方推荐的,更活跃):
pip install PySide6
下面是一个最简单的例子,创建一个窗口并在其中放置一个按钮。
使用 PyQt5
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
# 1. 创建一个应用程序实例
app = QApplication(sys.argv)
# 2. 创建一个主窗口
window = QWidget()
window.setWindowTitle('我的第一个按钮')
window.setGeometry(300, 300, 400, 200) # x, y, width, height
# 3. 创建一个 QPushButton
# 参数 '点击我' 是按钮上显示的文本
button = QPushButton('点击我', window)
# 4. 设置按钮的位置和大小 (x, y, width, height)
button.setGeometry(150, 80, 100, 40)
# 5. 显示窗口
window.show()
# 6. 运行应用程序的事件循环
sys.exit(app.exec_())
使用 PySide6 (代码结构几乎完全相同)
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('我的第一个按钮')
window.setGeometry(300, 300, 400, 200)
button = QPushButton('点击我', window)
button.setGeometry(150, 80, 100, 40)
window.show()
sys.exit(app.exec())
代码解释:
QApplication: 每个 PyQt/PySide 应用程序都必须有一个QApplication对象,它管理应用程序的主事件循环。QWidget: 所有用户界面对象的基类,我们用它来作为窗口的容器。QPushButton('点击我', window): 创建按钮实例,第一个参数是按钮的显示文本,第二个参数window指定了这个按钮的“父窗口”,意味着按钮将被放置在window内部。setGeometry(): 这是一个便捷方法,它同时设置了控件的位置 (x,y) 和大小 (width,height)。window.show(): 显示窗口,如果不调用,窗口将是不可见的。app.exec_()或app.exec(): 启动应用程序的事件循环,程序会一直运行,直到窗口被关闭。
核心功能:连接点击事件
按钮本身只是一个静态的控件,它的真正价值在于被点击后能执行我们想要的代码,这通过 信号与槽 机制实现。

- 信号: 由控件(如按钮)在某个特定事件发生时发出的通知。
QPushButton最常用的信号是clicked()。 - 槽: 一个可被调用的函数(Python 中就是普通函数或方法),用于响应信号。
使用 button.clicked.connect() 方法将信号和槽连接起来。
示例:点击按钮后打印信息
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
# --- 槽函数 ---
# 这个函数会在按钮被点击时被调用
def on_button_clicked():
print("按钮被点击了!")
# 你可以在这里执行任何操作,比如修改其他控件的属性
button.setText("已点击")
# --- 应用程序主逻辑 ---
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('信号与槽示例')
window.setGeometry(300, 300, 400, 200)
# 创建按钮
button = QPushButton('点击我', window)
# 将按钮的 clicked 信号连接到 on_button_clicked 函数
button.clicked.connect(on_button_clicked)
# 使用布局来管理控件,比 setGeometry 更灵活
layout = QVBoxLayout()
layout.addWidget(button)
window.setLayout(layout)
window.show()
sys.exit(app.exec())
关键点:
button.clicked.connect(on_button_clicked) 这行代码是核心,它告诉程序:“当 button 发出 clicked 信号时,请调用 on_button_clicked 这个函数。”
常用属性和方法
QPushButton 提供了丰富的属性和方法来定制其外观和行为。
| 属性/方法 | 描述 | 示例 |
|---|---|---|
setText(text) |
设置按钮上显示的文本。 | button.setText("新文本") |
text() |
获取按钮上当前的文本。 | current_text = button.text() |
setIcon(icon) |
设置按钮的图标,需要一个 QIcon 对象。 |
button.setIcon(QIcon("path/to/icon.png")) |
setIconSize(size) |
设置图标的大小,需要一个 QSize 对象。 |
button.setIconSize(QSize(32, 32)) |
setToolTip(text) |
设置当鼠标悬停在按钮上时显示的提示文本。 | button.setToolTip("这是一个重要的按钮") |
setEnabled(enabled) |
设置按钮是否可用。False 会让按钮变灰且无法点击。 |
button.setEnabled(False) |
isChecked() |
检查按钮是否处于“选中”状态,主要用于 QPushButton 的 checkable 模式。 |
if button.isChecked(): ... |
setCheckable(checkable) |
设置按钮是否可切换选中/未选中状态。 | button.setCheckable(True) |
toggle() |
切换按钮的选中状态。 | button.toggle() |
进阶示例:带图标和工具提示的按钮
这个例子综合运用了文本、图标和工具提示。
import sys
from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PySide6.QtGui import QIcon
from PySide6.QtCore import QSize
# 槽函数
def show_message():
print("保存按钮被点击了!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle('高级按钮示例')
window.setGeometry(300, 300, 400, 200)
# 创建一个保存按钮
save_button = QPushButton('保存', window)
# 1. 设置图标 (请确保你有一个名为 'save_icon.png' 的图片文件在脚本同目录下)
# 如果没有图片,可以省略这部分,或者使用Qt内置的图标
# save_icon = QIcon.fromTheme("document-save") # 尝试使用系统主题图标
try:
save_icon = QIcon("save_icon.png")
if not save_icon.isNull():
save_button.setIcon(save_icon)
except FileNotFoundError:
print("未找到图标文件,将不显示图标。")
# 2. 设置图标大小
save_button.setIconSize(QSize(24, 24))
# 3. 设置工具提示
save_button.setToolTip("点击以保存当前文件")
# 4. 连接信号和槽
save_button.clicked.connect(show_message)
# 使用布局
layout = QVBoxLayout()
layout.addWidget(save_button)
window.setLayout(layout)
window.show()
sys.exit(app.exec())
不同框架间的差异
对于 QPushButton PyQt5 和 PySide6 的用法几乎完全一样,主要的区别在于:
-
导入模块:
- PyQt5:
from PyQt5.QtWidgets import QPushButton - PySide6:
from PySide6.QtWidgets import QPushButton
- PyQt5:
-
应用程序事件循环的启动:
- PyQt5:
sys.exit(app.exec_())(注意下划线) - PySide6:
sys.exit(app.exec())(没有下划线)
- PyQt5:
-
许可证和开发支持:
- PyQt5: 使用 GPL 或商业许可证,由 Riverbank Computing 公司开发维护。
- PySide6: 使用 LGPL 许可证,允许用于商业闭源项目,由 The Qt Company 官方开发维护,是未来的发展方向。
QPushButton 是构建交互式 GUI 的基石,掌握它的使用是学习 PyQt/PySide 的第一步。
核心要点回顾:
- 创建:
QPushButton('文本', 父窗口) - 布局: 使用
QVBoxLayout,QHBoxLayout等布局管理器,而不是setGeometry,以实现更灵活的界面。 - 交互: 使用
button.clicked.connect(你的函数)将点击事件与自定义逻辑绑定。 - 定制: 通过
setText,setIcon,setToolTip等方法丰富按钮的外观和信息。
