Python PyQt

小飞兽 HTML/CSS 1 次阅读 2026-08-13

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:

    安装PyQt5

    pip install PyQt5

    安装Qt设计师和其他工具(可选)

    pip install 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_()

    代码解析

    1. 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)

更多常用组件内容参考:https://www.runoob.com/python3/python-pyqt-widgets.html


布局管理(QVBoxLayout)

使用布局管理器可以自动调整组件位置:

实例

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

layout = QVBoxLayout()
layout.addWidget(QLabel("用户名"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("登录"))
window.setLayout(layout)

更多布局管理内容参考:https://www.runoob.com/python3/python-pyqt-layout.html


信号与槽机制

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")  # 触发信号

    更多布局管理内容参考:https://www.runoob.com/python3/python-pyqt-signals-and-slots.html


    使用 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      # 图表支持
    组件类别组件名称所在模块说明
    基础窗口组件QWidgetQtWidgets所有用户界面对象的基类,可作为空白窗口或容器
    QMainWindowQtWidgets主窗口框架,包含菜单栏、工具栏、状态栏等
    QDialogQtWidgets对话框基类,用于弹出窗口
    布局管理QVBoxLayoutQtWidgets垂直布局管理器
    QHBoxLayoutQtWidgets水平布局管理器
    QGridLayoutQtWidgets网格布局管理器
    QFormLayoutQtWidgets表单布局管理器(标签+输入框对)
    按钮类QPushButtonQtWidgets普通按钮
    QRadioButtonQtWidgets单选按钮
    QCheckBoxQtWidgets复选框
    QToolButtonQtWidgets工具栏按钮(可带图标)
    输入控件QLineEditQtWidgets单行文本输入框
    QTextEditQtWidgets多行富文本编辑器(支持HTML)
    QPlainTextEditQtWidgets多行纯文本编辑器
    QSpinBoxQtWidgets数字调节框(整数)
    QDoubleSpinBoxQtWidgets数字调节框(浮点数)
    QComboBoxQtWidgets下拉选择框
    QDateEditQtWidgets日期选择框
    QTimeEditQtWidgets时间选择框
    QDateTimeEditQtWidgets日期时间选择框
    QSliderQtWidgets滑动条(水平/垂直)
    QDialQtWidgets圆形旋钮控件
    显示控件QLabelQtWidgets文本/图片标签
    QLCDNumberQtWidgetsLCD数字显示屏
    QProgressBarQtWidgets进度条
    QStatusBarQtWidgets状态栏(通常用于QMainWindow
    容器类QGroupBoxQtWidgets分组框(带标题的容器)
    QTabWidgetQtWidgets标签页容器
    QStackedWidgetQtWidgets堆叠容器(每次显示一个子控件)
    QScrollAreaQtWidgets滚动区域容器
    QMdiAreaQtWidgetsMDI(多文档界面)区域
    列表/表格/树QListWidgetQtWidgets列表控件(含项管理)
    QTreeWidgetQtWidgets树形控件
    QTableWidgetQtWidgets表格控件
    QListViewQtWidgets列表视图(需搭配数据模型)
    QTableViewQtWidgets表格视图(需搭配数据模型)
    QTreeViewQtWidgets树形视图(需搭配数据模型)
    菜单/工具栏QMenuBarQtWidgets菜单栏
    QMenuQtWidgets菜单(可包含子菜单和动作)
    QToolBarQtWidgets工具栏
    QActionQtWidgets动作(用于菜单项、工具栏按钮等)
    对话框QFileDialogQtWidgets文件选择对话框
    QColorDialogQtWidgets颜色选择对话框
    QFontDialogQtWidgets字体选择对话框
    QInputDialogQtWidgets输入对话框(文本、数字等)
    QMessageBoxQtWidgets消息提示框(警告、错误、询问等)
    图形视图QGraphicsViewQtWidgets图形视图框架(用于2D图形)
    QGraphicsSceneQtWidgets图形场景(配合QGraphicsView使用)
    其他功能组件QCalendarWidgetQtWidgets日历控件
    QSplashScreenQtWidgets启动画面
    QSystemTrayIconQtWidgets系统托盘图标
    QWebEngineViewQtWebEngineWidgets网页浏览器组件(需单独安装PyQtWebEngine

    学习资源

  • Qt 官方文档