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. 自定义组件

是什么

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

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

  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 官方内置可视化工具
≡