深入探讨 Python PyQt:构建图形用户界面的强大工具
PyQt 是一个强大的 Python 库,用于创建图形用户界面(GUI),可以用来代替 Python 内置的 Tkinter。
PyQt 是 Qt 框架的 Python 绑定,广泛应用于桌面应用程序开发。
Qt 是一个跨平台的 C++ 应用程序开发框架。
PyQt 允许 Python 开发者利用 Qt 库创建功能强大的 GUI 应用程序。
PyQt 有以下几个主要版本:
- PyQt4:基于 Qt4 的绑定
- PyQt5:基 于Qt5 的绑定
- PyQt6:基于 Qt6 的绑定(最新版本)
安装 PyQt
使用 pip 安装 PyQt5:
# 安装PyQt5pip install PyQt5# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5# 安装Qt设计师和其他工具(可选)pip install PyQt5-tools# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5-tools
第一个 PyQt 程序
创建简单窗口
以下是一个最基本的 PyQt 程序,创建一个空白窗口:
实例
from PyQt5.QtWidgets import QApplication, QWidget
# 创建应用实例
app = QApplication([])
# 创建主窗口
window = QWidget()
window.setWindowTitle(\"我的第一个 PyQt 程序\")
window.setGeometry(100, 100, 400, 300) # (x, y, width, height)
# 显示窗口
window.show()
# 运行应用
app.exec_()
代码解析
QApplication
:管理 GUI 应用程序的控制流和主设置。QWidget
:最基本的窗口类,所有 UI 组件都继承自它。setWindowTitle()
:设置窗口标题。setGeometry()
:设置窗口位置和大小。show()
:显示窗口。app.exec_()
:启动事件循环,等待用户交互。
一个典型的PyQt应用程序包含以下部分:
- QApplication对象:每个PyQt应用程序都需要有一个QApplication实例
- 窗口和控件:用户界面组件
- 事件循环:处理用户输入和系统事件的循环
- 事件处理器:响应事件的函数或方法
实例
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 设置窗口标题和大小
self.setWindowTitle(\"我的第一个PyQt应用\")
self.setGeometry(100, 100, 400, 300) # x, y, width, height
# 创建按钮
self.button = QPushButton(\"点击我\", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print(\"按钮被点击了!\")
if __name__ == \"__main__\":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
常用 PyQt 组件
按钮(QPushButton)
实例
from PyQt5.QtWidgets import QPushButton
button = QPushButton(\"点击我\", window)
button.move(150, 150) # 设置按钮位置
标签(QLabel)
实例
from PyQt5.QtWidgets import QLabel
label = QLabel(\"Hello PyQt!\", window)
label.move(100, 100)
文本框(QLineEdit)
实例
from PyQt5.QtWidgets import QLineEdit
textbox = QLineEdit(window)
textbox.move(100, 50)
更多常用组件内容参考:Python PyQt 常用组件 | 菜鸟教程
布局管理(QVBoxLayout)
使用布局管理器可以自动调整组件位置:
实例
from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton
layout = QVBoxLayout()
layout.addWidget(QLabel(\"用户名\"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton(\"登录\"))
window.setLayout(layout)
更多布局管理内容参考:Python PyQt 布局管理 | 菜鸟教程
信号与槽机制
PyQt 使用信号(Signal)和槽(Slot)机制处理事件。
PyQt 的信号和槽机制是用于对象之间通信的核心机制。
- 信号(Signal): 当特定事件发生时发出的通知
- 槽(Slot): 响应信号的函数或方法
实例
from PyQt5.QtWidgets import QPushButton
def on_button_click():
print(\"按钮被点击了!\")
button = QPushButton(\"点击我\", window)
button.clicked.connect(on_button_click) # 连接信号和槽
自定义信号
实例
from PyQt5.QtCore import pyqtSignal, QObject
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # 定义一个信号
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f\"收到信号: {x}\"))
emitter.my_signal.emit(\"Hello\") # 触发信号
更多布局管理内容参考:Python PyQt 信号与槽机制 | 菜鸟教程
使用 Qt Designer
Qt Designer 是一个可视化设计工具,可以拖放组件来设计界面:
- 启动 Designer (通常在 Python 安装目录的 Lib\\site-packages\\qt5_applications\\Qt\\bin 下)
- 设计界面并保存为 .ui 文件
-
将 .ui 文件转换为 Python 代码:
pyuic5 input.ui -o output.py
在代码中使用生成的界面:
实例
from PyQt5 import uic
# 加载UI文件
Form, Window = uic.loadUiType(\"output.ui\")
# 使用UI
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
实战:简单的记事本应用
界面设计
实例
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle(\'简易记事本\')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# 文件菜单动作
self.new_action = QAction(\'新建\', self)
self.new_action.setShortcut(\'Ctrl+N\')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction(\'打开\', self)
self.open_action.setShortcut(\'Ctrl+O\')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction(\'保存\', self)
self.save_action.setShortcut(\'Ctrl+S\')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction(\'退出\', self)
self.exit_action.setShortcut(\'Ctrl+Q\')
self.exit_action.triggered.connect(self.close)
# 编辑菜单动作
self.copy_action = QAction(\'复制\', self)
self.copy_action.setShortcut(\'Ctrl+C\')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction(\'粘贴\', self)
self.paste_action.setShortcut(\'Ctrl+V\')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction(\'剪切\', self)
self.cut_action.setShortcut(\'Ctrl+X\')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# 文件菜单
file_menu = menubar.addMenu(\'文件\')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# 编辑菜单
edit_menu = menubar.addMenu(\'编辑\')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, \'打开文件\')
if filename:
try:
with open(filename, \'r\') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, \'错误\', f\'无法打开文件: {e}\')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, \'保存文件\')
if filename:
try:
with open(filename, \'w\') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, \'错误\', f\'无法保存文件: {e}\')
if __name__ == \'__main__\':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())
PyQt5 核心组件
大多数组件位于 PyQt5.QtWidgets。
高级功能(如多媒体、网络)可能需要其他模块(如 QtCore, QtGui, QtNetwork 等)。
QListView/QTableView/QTreeView 需要搭配数据模型(如 QStandardItemModel)使用,灵活性更高。
其他安装扩展:
pip install PyQtWebEngine # 网页支持pip install PyQtChart # 图表支持
QWidget
QtWidgets
QMainWindow
QtWidgets
QDialog
QtWidgets
QVBoxLayout
QtWidgets
QHBoxLayout
QtWidgets
QGridLayout
QtWidgets
QFormLayout
QtWidgets
QPushButton
QtWidgets
QRadioButton
QtWidgets
QCheckBox
QtWidgets
QToolButton
QtWidgets
QLineEdit
QtWidgets
QTextEdit
QtWidgets
QPlainTextEdit
QtWidgets
QSpinBox
QtWidgets
QDoubleSpinBox
QtWidgets
QComboBox
QtWidgets
QDateEdit
QtWidgets
QTimeEdit
QtWidgets
QDateTimeEdit
QtWidgets
QSlider
QtWidgets
QDial
QtWidgets
QLabel
QtWidgets
QLCDNumber
QtWidgets
QProgressBar
QtWidgets
QStatusBar
QtWidgets
QMainWindow
)QGroupBox
QtWidgets
QTabWidget
QtWidgets
QStackedWidget
QtWidgets
QScrollArea
QtWidgets
QMdiArea
QtWidgets
QListWidget
QtWidgets
QTreeWidget
QtWidgets
QTableWidget
QtWidgets
QListView
QtWidgets
QTableView
QtWidgets
QTreeView
QtWidgets
QMenuBar
QtWidgets
QMenu
QtWidgets
QToolBar
QtWidgets
QAction
QtWidgets
QFileDialog
QtWidgets
QColorDialog
QtWidgets
QFontDialog
QtWidgets
QInputDialog
QtWidgets
QMessageBox
QtWidgets
QGraphicsView
QtWidgets
QGraphicsScene
QtWidgets
QGraphicsView
使用)QCalendarWidget
QtWidgets
QSplashScreen
QtWidgets
QSystemTrayIcon
QtWidgets
QWebEngineView
QtWebEngineWidgets
PyQtWebEngine
)