PyQt5把Qt各个组件分模块,90%开发只用到下面这几个,不用全部学。
python
# 最常用
from PyQt5 import QtWidgets, QtCore, QtGui
# 较少用
from PyQt5 import QtMultimedia, QtSerialPort, QtNetwork
1. QtWidgets【最重要,占日常70%】
所有可视化控件全部在这里,做界面必导入。
常用类:
- 基础窗口:
QApplication、QWidget、QMainWindow(主窗口,带菜单栏状态栏)、QDialog弹窗对话框 - 控件:
QPushButton按钮、QLabel标签(可显示文字/图片)、QLineEdit单行输入框、QTextEdit多行文本 - 选择控件:
QCheckBox复选框、QRadioButton单选框、QComboBox下拉框 - 布局管理器(非常关键):
QVBoxLayout垂直布局、QHBoxLayout水平布局、QGridLayout网格布局 - 弹窗:
QMessageBox消息弹窗、QFileDialog文件选择对话框 - 表格列表:
QTableWidget表格、QListWidget列表
python
from PyQt5.QtWidgets import (QMainWindow,QPushButton,QLabel,QVBoxLayout,
QMessageBox,QFileDialog,QTableWidget)
2. QtCore【核心非GUI模块,重中之重】
没有界面,但是Qt灵魂,信号槽、定时器、线程、常量都在这里。
常用:
- 信号槽 :
pyqtSignal自定义信号,跨线程通信必备 QThread:Qt线程,上位机开发最高频,处理相机、串口、网络,防止UI卡死QTimer定时器:周期性执行函数(定时刷新界面、轮询设备)QObject:所有Qt类的基类Qt:枚举常量,对齐方式、按键、颜色标记QPoint/QSize/QRect:坐标、尺寸、矩形
python
from PyQt5.QtCore import QThread, pyqtSignal, QTimer, Qt
⚠️重点:耗时操作(读相机、串口接收、大文件解析)放到
QThread,绝对不要阻塞主线程事件循环。
3. QtGui 绘图、图像、字体
负责画图、图片处理、画笔、字体,不负责控件。
常用类:
QPixmap:图片,适合给QLabel显示图像(海康相机/OpenCV图片转这个)QImage:图像,和OpenCV Mat互相转换用QPainter:绘图,画线、画框、画文字,在界面上画检测框QFont字体、QColor颜色
视觉上位机高频:OpenCV Mat → QImage → QPixmap → QLabel显示。
python
from PyQt5.QtGui import QPixmap, QImage, QPainter, QColor
4. QtSerialPort【工业项目高频:串口】
串口通信模块,单片机、PLC串口调试。
python
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
QSerialPort:打开串口、收发数据QSerialPortInfo:枚举本机所有串口
5. QtNetwork 网络通信
TCP/UDP客户端、服务端。
QTcpSocketTCP客户端QTcpServerTCP服务端
你之前C++写TCP服务端,PyQt可以用这套,自带信号槽,不用自己写select。
python
from PyQt5.QtNetwork import QTcpSocket, QTcpServer
6. QtMultimedia 多媒体(较少用)
音视频播放,一般工业软件很少用。
极简总结(按你的场景:视觉/工业上位机)
| 模块 | 用途 | 你的项目是否必用 |
|---|---|---|
| QtWidgets | 窗口、按钮、表格、布局 | ✅必用 |
| QtCore | 信号、QThread线程、定时器 | ✅必用 |
| QtGui | 图片、绘图(画YOLO检测框) | ✅必用 |
| QtSerialPort | 串口单片机通信 | ⭐经常用 |
| QtNetwork | TCP通信 | ⭐经常用 |
最经典的导入模板(直接复制)
python
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton,
QLabel, QVBoxLayout)
from PyQt5.QtCore import QThread, pyqtSignal, QTimer
from PyQt5.QtGui import QPixmap, QImage
开发上位机的固定套路
QtWidgets搭建UI界面- 相机/网络/串口耗时逻辑放到
QtCore.QThread子线程 - 子线程通过
pyqtSignal把图片、数据抛回主线程更新UI QtGui做图像转换,在label显示图片、绘制识别框- 需要串口用
QtSerialPort,TCP用QtNetwork
坑提醒:子线程禁止直接操作任何QtWidgets控件,只能通过自定义信号把数据传到主线程更新界面。
PyQt5 三大核心模块常用类 + 常用方法说明
三大模块:QtWidgets、QtCore、QtGui
一、PyQt5.QtWidgets 界面控件模块
所有可视化窗口、按钮、输入框、布局、弹窗;开发GUI最主要模块
| 常用类 | 常用成员/函数 | 说明 |
|---|---|---|
| QApplication | exec_() |
启动Qt主事件循环,阻塞等待界面事件 |
quit() |
退出应用程序 | |
| QWidget | show() |
显示控件/窗口 |
hide() |
隐藏控件 | |
resize(w,h) |
设置窗口大小 | |
setWindowTitle("xxx") |
设置窗口标题 | |
setLayout(layout) |
给控件设置布局管理器 | |
setParent(parent) |
设置父对象(Qt内存管理) | |
| QMainWindow | setCentralWidget(widget) |
设置主窗口中心部件 |
statusBar().showMessage("msg") |
底部状态栏显示提示文字 | |
| QPushButton 按钮 | setText("按钮") |
设置按钮显示文字 |
clicked |
信号,点击触发 | |
setEnabled(bool) |
设置按钮是否可点击 | |
| QLabel 标签 | setText("文字") |
设置显示文本 |
setPixmap(pixmap) |
显示图片(传入QPixmap) | |
setAlignment(Qt.AlignCenter) |
文字/图片居中对齐 | |
| QLineEdit 单行输入框 | setText() |
设置输入框内容 |
text() |
获取输入框字符串 | |
clear() |
清空内容 | |
textChanged |
信号:文本发生变化 | |
| QTextEdit 多行文本框 | append("xxx") |
追加一行文字(日志输出非常常用) |
toPlainText() |
获取全部文本 | |
clear() |
清空 | |
| QComboBox下拉框 | addItem("选项1") |
添加下拉选项 |
currentText() |
获取当前选中字符串 | |
currentIndexChanged |
信号,选中改变 | |
| 布局:QVBoxLayout | addWidget(widget) |
往布局添加控件,垂直排列 |
addStretch() |
添加弹性占位,撑开空白 | |
setSpacing() |
控件之间间距 | |
| 布局:QHBoxLayout | addWidget(widget) |
水平排列控件 |
| 布局:QGridLayout | addWidget(w,行,列) |
网格布局,表格摆放控件 |
| QMessageBox消息弹窗 | information(父,"标题","内容") |
普通信息弹窗 |
warning() |
警告弹窗 | |
critical() |
错误弹窗 | |
question() |
是/否询问弹窗,返回点击结果 | |
| QFileDialog文件对话框 | getOpenFileName() |
选择单个文件,返回文件路径 |
getExistingDirectory() |
选择文件夹 | |
| QTableWidget表格 | setRowCount() |
设置行数 |
setColumnCount() |
设置列数 | |
setItem(row,col,item) |
设置单元格内容 |
二、PyQt5.QtCore 核心非GUI模块
无界面,Qt底层灵魂:信号槽、线程、定时器、坐标、常量
| 常用类 | 常用成员/函数 | 说明 |
|---|---|---|
| pyqtSignal | pyqtSignal(类型) |
自定义信号,可携带参数;跨线程通信核心 |
.connect(回调函数) |
信号绑定回调函数 | |
.emit(数据) |
发射信号,触发绑定的函数 | |
| QThread | start() |
启动子线程,自动调用run() |
run() |
重写此函数,放子线程耗时业务逻辑 | |
finished |
信号:线程执行完毕发出 | |
terminate() |
强制终止线程(不推荐,资源不会释放) | |
| QTimer定时器 | start(ms) |
开启定时器,毫秒为单位,周期性触发timeout信号 |
stop() |
停止定时器 | |
timeout |
信号,定时时间到触发回调 | |
| QObject | deleteLater() |
安全延时释放对象内存 |
| Qt(枚举常量) | Qt.AlignCenter |
居中对齐,给QLabel、布局使用 |
Qt.KeepAspectRatio |
图片保持等比缩放 | |
| QRect | x(),y(),width(),height() |
矩形,保存坐标尺寸 |
| QPoint | x(),y() |
点坐标 |
| QSize | width(),height() |
尺寸 |
重点:子线程中绝对不能直接操作任何QtWidgets控件 ,只能用
pyqtSignal.emit()把数据发送到主线程更新UI。
三、PyQt5.QtGui 绘图、图像、字体工具模块
不提供现成窗口控件;提供绘图、图片、颜色、字体工具;供控件调用,也可自定义绘图
| 常用类 | 常用成员/函数 | 说明 |
|---|---|---|
| QPixmap | load("图片路径") |
从磁盘加载图片,适合交给QLabel显示 |
scaled(w,h,Qt.KeepAspectRatio) |
缩放图片,返回新QPixmap对象 | |
| QImage | width()、height() |
获取图像宽高;OpenCV Mat和QImage互转主要用它 |
bits() |
获取图像原始内存数据指针 | |
| QPainter画笔 | begin(obj) |
开始在目标控件上绘图 |
drawText(x,y,"文字") |
在指定坐标绘制文字 | |
drawRect(x,y,w,h) |
画矩形框(画YOLO检测框高频) | |
drawImage(x,y,qimage) |
绘制QImage图像 | |
end() |
结束绘图;一般放在paintEvent自动管理不用手动调用 | |
| QColor | setRgb(r,g,b,a) |
设置颜色,RGBA0‑255 |
| QFont字体 | QFont("字体名",字号) |
构造字体对象,传给QLabel使用 |
使用场景:
- OpenCV → QImage → QPixmap → QLabel显示图像(视觉上位机)
- 重写
paintEvent,使用QPainter画框、标注文字
快速记忆小结
- 想要按钮、窗口、标签、弹窗 → QtWidgets
- 想要线程、定时器、自定义信号 → QtCore
- 想要处理图片、画笔绘图、颜色字体对象 → QtGui
极简导入模板(复制直接用)
python
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel,
QVBoxLayout, QMessageBox, QFileDialog)
from PyQt5.QtCore import QThread, pyqtSignal, QTimer, Qt
from PyQt5.QtGui import QPixmap, QImage, QPainter, QColor, QFont