pyqt5 -- QtWidgets QtWidgets是 PyQt5 中用于构建经典桌面风格界面的核心模块。你可以把它想象成一个“GUI控件百宝箱”里面包含了创建窗口、按钮、文本框、表格等所有你需要的可视化组件。它的核心思想是面向对象的所有可视元素都继承自QWidget基类使得界面元素的组合和扩展非常灵活。基石三种核心窗口类在QtWidgets中有三种最基础的窗口类它们是任何PyQt5应用的起点QWidget所有用户界面元素的基类。它像一个“空白画布”自由度最高允许你从零开始构建任何样式的界面。QMainWindow主应用程序窗口。它继承自QWidget并预置了菜单栏(QMenuBar)、工具栏(QToolBar)、状态栏(QStatusBar) 和中央区域(centralWidget)。适合创建带有完整框架的复杂应用。QDialog对话框窗口的基类。通常用于执行短期任务或与用户进行一次性交互比如文件选择、消息提示或设置窗口。常用控件一览QtWidgets提供了丰富的现成控件可以满足大部分界面需求。以下是一些最常用的布局管理让界面自适应布局管理器负责自动调整子控件的位置和大小以应对窗口尺寸的变化。推荐使用布局管理器而不是通过setGeometry()进行绝对定位。QHBoxLayout水平布局将子控件从左到右排列。QVBoxLayout垂直布局将子控件从上到下排列。QGridLayout网格布局以行和列的网格形式放置控件。QFormLayout表单布局专为“标签-字段”式的数据录入表单设计。示例创建一个包含标签和按钮的垂直布局窗口。import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayoutclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle(布局示例)# 1. 创建控件self.label QLabel(Hello, PyQt5!)self.button QPushButton(点击我)# 2. 创建布局管理器layout QVBoxLayout()# 3. 将控件添加到布局中layout.addWidget(self.label)layout.addWidget(self.button)# 4. 将布局设置为窗口的主布局self.setLayout(layout)if __name__ __main__:app QApplication(sys.argv)window MyWindow()window.show()sys.exit(app.exec_())信号与槽交互的“连接线”信号与槽是PyQt5对象间通信的核心机制。简单说信号就是一个“事件”如按钮被点击而槽就是响应这个事件的“函数”。基础用法定义槽函数编写一个普通的Python函数来处理事件。连接信号与槽使用信号.connect(槽函数)将两者绑定注意事项对象树与内存管理创建控件时指定父对象如QLabel(self)PyQt5 会自动管理其生命周期父对象销毁时子对象也会被销毁有效防止内存泄漏。样式表QSS的作用域为父控件设置样式表会影响所有子控件。为避免“污染”应使用ID选择器如#myButton或类选择器来限定样式的作用范围。避免界面卡顿耗时的操作如网络请求、大文件读写应放在子线程中执行否则会阻塞主线程事件循环导致界面“卡死”。导入规范通常使用from PyQt5.QtWidgets import *导入所有控件但为提升代码可读性也可以按需导入特定的类。QApplication实例唯一一个PyQt5程序有且只有一个QApplication实例它管理着应用程序的控制流和主要设置。拓展介绍1、高级组件与容器2、模型/视图框架Model/View对于大规模数据展示如数据库记录、文件列表直接使用QTableWidget、QListWidget等“便利类”会导致内存浪费和性能下降因为它们会复制数据并维护每个单元格的控件。模型/视图框架将数据存储QAbstractItemModel与数据显示QListView、QTableView、QTreeView分离更高效、更灵活。内置模型QStandardItemModel、QFileSystemModel、QSqlTableModel等。自定义模型只需重写rowCount()、columnCount()、data()等方法即可与任意 Python 数据源对接。委托Delegate通过继承QStyledItemDelegate可自定义单元格的编辑器如弹出日期选择器和绘制方式。class MyTableModel(QAbstractTableModel):def __init__(self, data):super().__init__()self._data datadef rowCount(self, parent):return len(self._data)def columnCount(self, parent):return len(self._data[0])def data(self, index, role):if role Qt.DisplayRole:return self._data[index.row()][index.column()]视图与模型绑定后数据更新只需调用模型的dataChanged等信号视图会自动刷新。3、样式定制与主题Qt 样式表QSS语法类似 CSS可精细定制控件外观背景色、边框、圆角、渐变、伪状态:hover、:pressed等。建议为复杂应用定义全局样式表保持视觉统一。QPalette用于设置颜色组但颗粒度不如 QSS 细。自定义绘制重写控件的paintEvent()方法实现任意图形绘制如自定义进度条、图表等。最佳实践将样式表保存在外部.qss文件中运行时读取便于切换主题。4、多线程与界面通信GUI 应用的主线程负责处理事件循环响应鼠标点击、重绘等任何耗时操作网络请求、大文件读写、复杂计算都会阻塞界面导致“卡死”。正确做法使用QThread创建工作线程通过信号pyqtSignal将结果传回主线程更新 UI。使用QThreadPoolQRunnable适用于轻量级并发任务。QTimer可用于定时刷新界面但不可用于耗时任务。class Worker(QThread):result pyqtSignal(str)def run(self):# 耗时操作self.result.emit(完成)# 在主窗口启动self.worker Worker()self.worker.result.connect(self.update_label)self.worker.start()注意子线程中禁止直接操作 GUI 控件必须通过信号/槽机制。