入门程序
helloworld.py
import random
import sys
# 导入所需的模块
from PySide6 import QtCore, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.hello = ["你好世界", "Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир"]
# 设置窗口大小,单位为像素
self.resize(800, 600)
# 创建一个按钮控件,其上文字为“点击我”
self.button = QtWidgets.QPushButton("点击我!")
# 创建一个标签控件,内容为Hello World,对齐方式为居中
self.text = QtWidgets.QLabel("Hello World", alignment=QtCore.Qt.AlignCenter)
# 创建一个「垂直盒子」布局管理器
self.layout = QtWidgets.QVBoxLayout(self)
# 将之前创建的控件添加到布局管理器中,即完成布局
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
# 将button.clicked这个信号与self.magic槽函数连接
self.button.clicked.connect(self.magic) # type: ignore
@QtCore.Slot()
def magic(self) -> None:
"""槽函数"""
self.text.setText(random.choice(self.hello)) # 从列表中随机显示一条问候语
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程
1导入模块
import random
import sys
from PySide6 import QtCore, QtWidgets
random
:用来随机选择问候语sys
:用来获取命令行参数、退出程序PySide6
:Qt for Python 库,包含 GUI 所需的类QtCore
:核心模块(信号/槽、事件、枚举)QtWidgets
:所有常用控件(按钮、标签、窗口、布局)
2 定义窗口类
class MyWidget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
📌 PySide6 vs PyQt6:几乎一样,只是授权协议不同,API 兼容。
QWidget
是 Qt 里所有控件的基类
这里我们自定义一个窗口类,继承自 QWidget
super().__init__()
调用父类构造函数,初始化控件
3 初始化窗口属性
self.hello = ["你好世界", "Hallo Welt", "Hei maailma", "Hola Mundo", "Привет мир"]
self.resize(800, 600)
self.hello
:一个列表,保存多种语言的问候语
resize(800, 600)
:设置窗口大小
4 创建控件
self.button = QtWidgets.QPushButton("点击我!")
self.text = QtWidgets.QLabel("Hello World", alignment=QtCore.Qt.AlignCenter)
QPushButton
:按钮控件
QLabel
:标签控件,用于显示文本
alignment=QtCore.Qt.AlignCenter
:设置文本居中
5 设置布局
self.layout = QtWidgets.QVBoxLayout(self)
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
QVBoxLayout
:垂直布局,控件按从上到下排列addWidget()
:把控件加入布局- 这样
self.text
在上,self.button
在下
🔑 重点:Qt 通过布局管理器自动调整控件位置和大小,不需要手动写坐标。
6 信号与槽(事件绑定)
self.button.clicked.connect(self.magic)
button.clicked
:按钮点击信号.connect(self.magic)
:连接到一个槽函数(事件处理函数)- 当按钮被点击,就自动调用
magic()
这就是 Qt 的 信号/槽机制,类似于 C++ 的事件回调。
7 槽函数
@QtCore.Slot()
def magic(self) -> None:
self.text.setText(random.choice(self.hello))
@QtCore.Slot()
:告诉 Qt 这是一个槽函数
random.choice(self.hello)
:随机选一个问候语
setText()
:更新标签显示
8 程序入口
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec())
QApplication
:Qt 应用程序对象,必须有且只有一个
widget = MyWidget()
:实例化我们自定义的窗口类
widget.show()
:显示窗口
app.exec()
:进入 Qt 事件循环,程序开始响应用户操作
sys.exit()
:程序正常退出时返回状态码
9 程序运行流程图
程序开始
│
├─ 创建 QApplication(必须有)
│
├─ 实例化 MyWidget 窗口
│ ├─ 创建控件(按钮、标签)
│ ├─ 设置布局
│ └─ 绑定信号槽
│
├─ show() 显示窗口
│
└─ 进入事件循环(等待用户点击按钮、关闭窗口等)
PySide6 常见控件对照表
1. 按钮类(Button Widgets)
控件 | 作用 | 示例代码 |
---|---|---|
QPushButton | 普通按钮 | self.btn = QtWidgets.QPushButton("确定") |
QCheckBox | 复选框 | self.chk = QtWidgets.QCheckBox("同意协议") |
QRadioButton | 单选按钮 | self.radio = QtWidgets.QRadioButton("选项A") |
QToolButton | 工具按钮(小图标) | self.toolbtn = QtWidgets.QToolButton() |
2. 输入类(Input Widgets)
控件 | 作用 | 示例代码 |
---|---|---|
QLineEdit | 单行文本输入 | self.line = QtWidgets.QLineEdit() |
QTextEdit | 多行文本框 | self.textedit = QtWidgets.QTextEdit() |
QPlainTextEdit | 多行纯文本框(更轻量) | self.plain = QtWidgets.QPlainTextEdit() |
QSpinBox | 整数输入(带上下箭头) | self.spin = QtWidgets.QSpinBox() |
QDoubleSpinBox | 浮点数输入 | self.dspin = QtWidgets.QDoubleSpinBox() |
QSlider | 滑动条 | self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) |
QComboBox | 下拉框 | self.combo = QtWidgets.QComboBox(); self.combo.addItems(["A","B","C"]) |
3. 显示类(Display Widgets)
控件 | 作用 | 示例代码 |
---|---|---|
QLabel | 显示文字/图片 | self.label = QtWidgets.QLabel("Hello") |
QLCDNumber | 显示数字(像电子钟) | self.lcd = QtWidgets.QLCDNumber() |
QProgressBar | 进度条 | self.progress = QtWidgets.QProgressBar() |
QCalendarWidget | 日历控件 | self.calendar = QtWidgets.QCalendarWidget() |
QDial | 圆形旋钮 | self.dial = QtWidgets.QDial() |
4. 容器类(Container Widgets)
控件 | 作用 | 示例代码 |
---|---|---|
QGroupBox | 分组框 | self.group = QtWidgets.QGroupBox("分组") |
QTabWidget | 选项卡面板 | self.tab = QtWidgets.QTabWidget() |
QScrollArea | 可滚动区域 | self.scroll = QtWidgets.QScrollArea() |
QSplitter | 可拖拽分隔 | self.splitter = QtWidgets.QSplitter() |
5. 数据类(Data Widgets)
控件 | 作用 | 示例代码 |
---|---|---|
QTableWidget | 表格 | self.table = QtWidgets.QTableWidget(3, 2) |
QTreeWidget | 树形结构 | self.tree = QtWidgets.QTreeWidget() |
QListWidget | 列表控件 | self.list = QtWidgets.QListWidget() |
6. 布局管理器(Layouts)
控件 | 作用 | 示例代码 |
---|---|---|
QVBoxLayout | 垂直布局 | layout = QtWidgets.QVBoxLayout(self) |
QHBoxLayout | 水平布局 | layout = QtWidgets.QHBoxLayout(self) |
QGridLayout | 网格布局 | layout = QtWidgets.QGridLayout(self) |
QFormLayout | 表单布局 | layout = QtWidgets.QFormLayout(self) |
测试
import sys
from PySide6 import QtWidgets, QtCore
class Demo(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("控件演示")
self.resize(400, 300)
layout = QtWidgets.QVBoxLayout(self)
# 换不同控件试试看
widget = QtWidgets.QComboBox()
widget.addItems(["选项1", "选项2", "选项3"])
layout.addWidget(widget)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = Demo()
win.show()
sys.exit(app.exec())
最小框架
import sys
from PySide6 import QtCore, QtGui, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("空白测试模板")
self.resize(800, 600)
self.setup_ui()
def setup_ui(self) -> None:
"""设置界面"""
# 在此处编写设置UI的代码
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.show()
sys.exit(app.exec())
QtCore
概览
QtCore
提供 不依赖界面(非 GUI)的核心功能,主要包括:
- 时间与定时器
- 信号与槽(事件通信机制)
- 基础数据类型(字符串、日期、时间、URL、文件路径等)
- 多线程、定时任务
- 事件循环
- 国际化(翻译、编码)
换句话说:
👉 QtCore
负责逻辑和底层支持,QtWidgets
负责界面,QtGui
负责图形。
分类
1. 信号与槽(事件机制)
Qt 独特的机制,控件之间通信靠它完成。
- **信号 (Signal)**:事件发生时发出通知
- **槽 (Slot)**:接收信号的处理函数
示例:
from PySide6 import QtCore, QtWidgets
import sys
class Demo(QtWidgets.QWidget):
def __init__(self):
super().__init__()
btn = QtWidgets.QPushButton("点我")
btn.clicked.connect(self.say_hello) # 信号 → 槽
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(btn)
@QtCore.Slot() # 声明这是一个槽函数(可选)
def say_hello(self):
print("Hello QtCore!")
app = QtWidgets.QApplication(sys.argv)
w = Demo()
w.show()
sys.exit(app.exec())
2. 时间与定时器
QTimer
→ 定时执行某个任务QTime
→ 表示时间(时、分、秒)QDate
→ 表示日期(年、月、日)QDateTime
→ 日期 + 时间
示例(每秒打印一次时间):
from PySide6 import QtCore
def tick():
print(QtCore.QTime.currentTime().toString())
timer = QtCore.QTimer()
timer.timeout.connect(tick)
timer.start(1000) # 1000ms = 1秒
3. 核心数据类型
QStringListModel
→ 用于存储字符串列表,结合控件(如 QListView)使用QPoint
,QSize
,QRect
→ 位置、大小、矩形区域QUrl
→ URL 地址QVariant
→ 通用数据类型包装
示例:
point = QtCore.QPoint(10, 20)
print(point.x(), point.y()) # 输出 (10, 20)
4. 文件与路径
QFile
,QDir
→ 文件与目录操作QFileInfo
→ 文件信息(大小、类型、路径等)QStandardPaths
→ 获取系统标准路径(桌面、文档、下载目录等)
示例(获取桌面路径):
desktop = QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.DesktopLocation)
print("桌面路径:", desktop)
5. 多线程
QThread
→ 线程基类QRunnable + QThreadPool
→ 线程池机制QMutex
,QSemaphore
→ 线程同步
6. 其他常用类
QEventLoop
→ 事件循环QObject
→ 所有 Qt 对象的基类(支持信号槽)QCoreApplication
→ 非 GUI 应用的核心类(类似 QApplication 但没有界面)
测试
import sys
from PySide6 import QtCore, QtWidgets
class ClockWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("时钟示例")
self.resize(300, 100)
self.label = QtWidgets.QLabel("", alignment=QtCore.Qt.AlignCenter)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.label)
# 每秒更新一次时间
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.update_time)
self.timer.start(1000)
self.update_time()
def update_time(self):
now = QtCore.QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
self.label.setText(now)
app = QtWidgets.QApplication(sys.argv)
w = ClockWidget()
w.show()
sys.exit(app.exec())
归纳
1️⃣ 核心基类
- QObject → 所有 Qt 对象的基类(支持信号/槽、事件系统)
- QCoreApplication → 非 GUI 程序入口(有事件循环,但没界面)
- QEventLoop → 手动事件循环(等待某个操作完成)
- QEvent → 事件基类(鼠标、键盘、窗口事件都继承它)
2️⃣ 信号与槽(事件机制)
- pyqtSignal / Signal → 定义自定义信号
- pyqtSlot / Slot → 声明槽函数(可选)
- Qt → 一堆枚举(对齐方式、方向、快捷键修饰符等等)
3️⃣ 时间相关
- QTimer → 定时器(周期性任务)
- QTime → 只表示时间(时:分:秒)
- QDate → 只表示日期(年-月-日)
- QDateTime → 日期 + 时间
4️⃣ 文件与路径
- QFile → 文件读写
- QDir → 目录操作
- QFileInfo → 文件信息(大小、路径、类型)
- QStandardPaths → 获取系统路径(桌面、下载、文档)
5️⃣ 数据类型与模型
- QPoint → 点(x,y)
- QSize → 尺寸(宽,高)
- QRect → 矩形(位置 + 尺寸)
- QUrl → URL 地址
- QByteArray → 字节数组(二进制数据)
- QStringListModel → 字符串列表模型(可用于 QListView)
- QVariant → 通用数据包装(Python 里很少直接用)
6️⃣ 线程与并发
- QThread → 线程基类
- QRunnable → 可运行任务
- QThreadPool → 线程池
- QMutex → 互斥锁
- QSemaphore → 信号量
- QFuture / QPromise(在 Qt6 更常用)→ 异步任务
7️⃣ 其他工具类
- QLocale → 本地化信息(语言、货币、日期格式)
- QTimerEvent → 定时器事件
- QSettings → 配置文件存储(INI/注册表)
- QCommandLineParser → 命令行参数解析
- QResource → 内置资源系统(图片、QSS 打包到 exe 里)
🔑 总结
QtCore
就像 Qt 的内核工具箱,主要提供:
- 程序框架:QObject、QCoreApplication、事件循环
- 信号槽机制:Signal、Slot
- 时间管理:QTimer、QDateTime
- 文件路径:QFile、QDir、QStandardPaths
- 基础数据类型:QPoint、QRect、QSize、QUrl
- 多线程:QThread、QThreadPool
- 其他实用工具:QSettings、QLocale
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jungle8884@163.com