PySide6 核心组件速查手册(含示例)


1. QApplication —— 应用程序主控

导入from PySide6.QtWidgets import QApplication


2. QWidget —— 基础窗口/控件基类

导入from PySide6.QtWidgets import QWidget

几乎所有可视部件都继承自 QWidget


3. QPushButton —— 按钮

导入from PySide6.QtWidgets import QPushButton


4. QLabel —— 标签

导入from PySide6.QtWidgets import QLabel


5. QLineEdit —— 单行输入框

导入from PySide6.QtWidgets import QLineEdit


6. QTextEdit —— 多行文本编辑器

导入from PySide6.QtWidgets import QTextEdit


7. QCheckBox —— 复选框

导入from PySide6.QtWidgets import QCheckBox


8. QComboBox —— 下拉列表框

导入from PySide6.QtWidgets import QComboBox


9. QSpinBox —— 数字调节框

导入from PySide6.QtWidgets import QSpinBox


10. QSlider —— 滑动条

导入from PySide6.QtWidgets import QSlider
额外导入from PySide6.QtCore import Qt


11. QProgressBar —— 进度条

导入from PySide6.QtWidgets import QProgressBar


12. 布局管理器

12.1 QVBoxLayout —— 垂直布局

导入from PySide6.QtWidgets import QVBoxLayout

from PySide6.QtWidgets import QWidget, QVBoxLayout, QPushButton

w = QWidget()
layout = QVBoxLayout(w)         # 布局绑定到 w
layout.addWidget(QPushButton("顶部"))
layout.addWidget(QPushButton("中间"))
layout.addStretch()             # 弹性空间,把按钮向上推
layout.addWidget(QPushButton("底部"))
w.show()

12.2 QHBoxLayout —— 水平布局

导入from PySide6.QtWidgets import QHBoxLayout

from PySide6.QtWidgets import QHBoxLayout

layout = QHBoxLayout()
layout.addWidget(QPushButton("左"))
layout.addWidget(QPushButton("中"))
layout.addWidget(QPushButton("右"))

12.3 QGridLayout —— 网格布局

导入from PySide6.QtWidgets import QGridLayout

layout = QGridLayout()
layout.addWidget(QLabel("姓名"), 0, 0)       # 第0行第0列
layout.addWidget(QLineEdit(), 0, 1)          # 第0行第1列
layout.addWidget(QLabel("密码"), 1, 0)
layout.addWidget(QLineEdit(), 1, 1)

13. QGroupBox —— 分组框

导入from PySide6.QtWidgets import QGroupBox


14. QDialog —— 对话框基类

导入from PySide6.QtWidgets import QDialog


15. QMessageBox —— 标准消息框

导入from PySide6.QtWidgets import QMessageBox


16. QFileDialog —— 文件对话框

导入from PySide6.QtWidgets import QFileDialog


17. QMainWindow —— 主窗口框架

导入from PySide6.QtWidgets import QMainWindow

提供菜单栏、工具栏、状态栏、中央部件。

from PySide6.QtWidgets import QMainWindow, QTextEdit
from PySide6.QtGui import QAction

class MainWin(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("编辑器")

        # 中央部件
        self.setCentralWidget(QTextEdit())

        # 菜单栏
        file_menu = self.menuBar().addMenu("文件")
        exit_act = QAction("退出", self)
        exit_act.triggered.connect(self.close)
        file_menu.addAction(exit_act)

        # 工具栏
        toolbar = self.addToolBar("快捷")
        toolbar.addAction(exit_act)

        # 状态栏
        self.statusBar().showMessage("就绪")

win = MainWin()
win.show()

18. QAction —— 动作

导入from PySide6.QtGui import QAction, QIcon

act = QAction(QIcon("open.png"), "打开", self)
act.setShortcut("Ctrl+O")
act.setStatusTip("打开文件")
act.triggered.connect(lambda: print("执行打开"))

# 可勾选动作
toggle_act = QAction("显示侧栏", self)
toggle_act.setCheckable(True)
toggle_act.setChecked(True)
toggle_act.toggled.connect(lambda checked: print("勾选状态:", checked))

19. QMenu —— 菜单

# 下拉菜单
menubar = self.menuBar()
file_menu = menubar.addMenu("文件")
file_menu.addAction("新建")
file_menu.addSeparator()
file_menu.addAction("退出")

# 子菜单
recent = file_menu.addMenu("最近打开")
recent.addAction("文件1.txt")

# 右键菜单
def contextMenuEvent(self, event):
    menu = QMenu(self)
    menu.addAction("复制")
    menu.addAction("粘贴")
    action = menu.exec(event.globalPos())
    if action and action.text() == "复制":
        print("执行复制")

20. QToolBar —— 工具栏

tb = self.addToolBar("工具")
tb.addAction(save_act)
# 添加搜索框
tb.addWidget(QLineEdit("搜索..."))

21. QTableWidget —— 表格

导入from PySide6.QtWidgets import QTableWidget, QTableWidgetItem

table = QTableWidget(3, 2)           # 3行2列
table.setHorizontalHeaderLabels(["姓名", "年龄"])
table.setItem(0, 0, QTableWidgetItem("张三"))
table.setItem(0, 1, QTableWidgetItem("25"))
print(table.item(0, 0).text())       # 输出: 张三

22. QThread —— 工作线程

导入from PySide6.QtCore import QThread, Signal

class Worker(QThread):
    progress = Signal(int)

    def run(self):
        for i in range(101):
            self.progress.emit(i)
            self.msleep(50)   # 模拟耗时

# 使用
worker = Worker()
bar = QProgressBar()
worker.progress.connect(bar.setValue)
worker.start()

23. 信号与槽机制

导入from PySide6.QtCore import QObject, Signal

class MyObject(QObject):
    finished = Signal(str)

obj = MyObject()
obj.finished.connect(lambda msg: print("收到:", msg))
obj.finished.emit("任务完成")
# 输出: 收到: 任务完成

24. 自定义组件

是什么

自定义组件就是你通过继承现有控件(如 QWidgetQPushButton),把多个子控件组合在一起,或者重写绘制逻辑,形成一个新的、可复用的界面模块。它可以:

创建自定义组件的基本模式

  1. 继承 QWidget(或其他控件)
  2. __init__ 中创建子控件并设置布局
  3. 定义公共方法,供外部读取或修改状态
  4. 可选:自定义信号,通知外部内部事件发生
  5. 可选:重写 paintEvent 实现自定义绘制

常用方法 / 信号(自定义组件中自行添加的公共成员)

成员 中文意思 说明
Signal 信号 在类中定义,用于通知外部事件发生
emit(...) 发射信号 发射信号,可携带参数
自定义方法 暴露给外部的公共接口,如 text()setValue()
update() 请求重绘 调用后会自动触发 paintEvent(用于自定义绘制)

示例1:组合控件(带标签的输入框)

from PySide6.QtWidgets import QWidget, QLabel, QLineEdit, QHBoxLayout

class LabeledInput(QWidget):
    """标签 + 输入框的组合控件"""
    def __init__(self, label_text, parent=None):
        super().__init__(parent)                   # parent:父控件
        self.label = QLabel(label_text, self)      # label_text:标签文字
        self.edit = QLineEdit(self)
        layout = QHBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.edit)

    def text(self):
        """获取输入框文字"""
        return self.edit.text()

    def setText(self, text):
        """设置输入框文字"""
        self.edit.setText(text)

使用:

name_input = LabeledInput("姓名:")
name_input.setText("张三")
print(name_input.text())  # 张三

示例2:带信号的自定义组件(搜索框)

from PySide6.QtCore import Signal
from PySide6.QtWidgets import QWidget, QLineEdit, QPushButton, QHBoxLayout

class SearchBox(QWidget):
    search_clicked = Signal(str)   # 自定义信号,携带搜索关键词

    def __init__(self, parent=None):
        super().__init__(parent)
        self.edit = QLineEdit(self)
        self.edit.setPlaceholderText("输入关键词")
        self.btn = QPushButton("搜索", self)

        layout = QHBoxLayout(self)
        layout.addWidget(self.edit)
        layout.addWidget(self.btn)

        self.btn.clicked.connect(self._on_search)
        self.edit.returnPressed.connect(self._on_search)

    def _on_search(self):
        keyword = self.edit.text().strip()
        if keyword:
            self.search_clicked.emit(keyword)   # 发射信号

使用:

box = SearchBox()
box.search_clicked.connect(lambda kw: print("搜索:", kw))

示例3:自定义绘制(圆形进度条)

from PySide6.QtWidgets import QWidget
from PySide6.QtGui import QPainter, QColor, QPen, QFont
from PySide6.QtCore import Qt, QRectF

class CircleProgress(QWidget):
    """圆形进度条(0-100)"""
    def __init__(self, parent=None):
        super().__init__(parent)
        self._value = 0
        self.setFixedSize(120, 120)   # 固定尺寸

    def value(self):
        return self._value

    def setValue(self, v):
        """设置进度值(0-100),并刷新显示"""
        self._value = max(0, min(100, v))
        self.update()                 # 触发 paintEvent

    def paintEvent(self, event):
        """重写绘制事件,绘制圆形进度条"""
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)

        # 背景圆环
        pen = QPen(QColor("#E0E0E0"), 10)
        painter.setPen(pen)
        painter.drawEllipse(15, 15, 90, 90)

        # 进度弧
        pen.setColor(QColor("#4CAF50"))
        painter.setPen(pen)
        span = int(self._value * 360 / 100) * 16
        painter.drawArc(QRectF(15, 15, 90, 90), 90 * 16, -span)

        # 百分比文字
        painter.setPen(QColor("#333333"))
        painter.setFont(QFont("Arial", 14, QFont.Weight.Bold))
        painter.drawText(self.rect(), Qt.AlignmentFlag.AlignCenter, f"{self._value}%")
        painter.end()

使用:

bar = CircleProgress()
bar.setValue(75)   # 显示 75%

PySide6 官方内置可视化工具

在安装了 PySide6 后,除了代码,官方还提供了几款可视化的辅助工具。它们通常位于你的 venv\Scripts\ 目录下,推荐直接在某 IDE(如 VS Code 或 PyCharm)的终端 (Terminal) 里输入命令来启动。

1. 界面设计器(Qt Designer)

2. 翻译助手(Qt Linguist)

3. 帮助文档助手(Qt Assistant)


💡 两个“隐形的”命令行工具

虽然它们不是可视化界面,但却是配合 Designer 跑起来必不可少的骨干工具(也建议记下来):

  1. pyside6-uic (UI转代码工具)
    • 作用: 将 Qt Designer 画出来的 .ui 文件,转换成 Python 能读懂的 .py 代码
    • 用法: 在终端执行 pyside6-uic 你的界面.ui -o ui_界面.py
  2. pyside6-rcc (资源转换工具)
    • 作用: 如果你在界面里加了图片、图标,你需要把它们编写进一个 .qrc 资源文件里,然后用这个命令行工具将图片资源转成 Python 文件打包进程序里。
    • 用法: 在终端执行 pyside6-rcc 你的资源.qrc -o 资源_rc.py

(新手提示:别怕,你平时只需要记住 designer 画图,然后跑一次 uic 转成代码,就可以在 main.py 里写了。)

PySide6 核心组件速查手册(含示例)
12. 布局管理器
24. 自定义组件
PySide6 官方内置可视化工具