PySide:修订间差异
(→UI元素) |
无编辑摘要 |
||
第64行: | 第64行: | ||
}} | }} | ||
== | ==常用控件== | ||
PySide6. | PySide6.QtWidgets模块提供了很多常用控件,用于创建用户界面。 | ||
{{了解更多 | {{了解更多 | ||
第72行: | 第71行: | ||
}} | }} | ||
== 图标 == | |||
=== 内置图标 === | === 内置图标 === | ||
PySide6 内置图标浏览复制 | PySide6 内置图标浏览复制 |
2025年2月13日 (四) 02:44的最新版本
PySide是Qt公司开发的Python版GUI工具包。支持多Windows、Linux和macOS平台。
简介
时间轴
2009年,发布PySide,支持Qt 4。
安装
使用pip安装
pip install pyside6
了解更多 >> PySide 文档:快速开始 PyPi:PySide6
快速入门
from PySide6 import QtCore, QtWidgets
app = QtWidgets.QApplication()
widget = QtWidgets
widget = QtWidgets.QLabel('hello, world', alignment=QtCore.Qt.AlignCenter)
widget.resize(600, 400)
widget.show()
app.exec()
按钮点击时调用函数。
import sys
from PySide6 import QtCore, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.button = QtWidgets.QPushButton("点击!")
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)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
self.text.setText("你点击了按钮。")
if __name__ == "__main__":
app = QtWidgets.QApplication([])
widget = MyWidget()
widget.resize(800, 600)
widget.show()
sys.exit(app.exec())
了解更多 >> PySide 文档:快速开始
常用控件
PySide6.QtWidgets模块提供了很多常用控件,用于创建用户界面。
了解更多 >> PySide 文档:QtWidgets
图标
内置图标
PySide6 内置图标浏览复制
import sys
from PySide6.QtWidgets import QApplication, QGridLayout, QPushButton, QStyle, QWidget
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PySide6 内置图标浏览复制")
icons = sorted(
[attr for attr in dir(QStyle.StandardPixmap) if attr.startswith("SP_")]
)
layout = QGridLayout()
for n, name in enumerate(icons):
btn = QPushButton(name)
pixmapi = getattr(QStyle, name)
icon = self.style().standardIcon(pixmapi)
btn.setIcon(icon)
# 按钮点击事件
btn.clicked.connect(lambda checked, icon_text=name: self.copy_to_clipboard(icon_text))
layout.addWidget(btn, n / 5, n % 5)
self.setLayout(layout)
def copy_to_clipboard(self, icon_text):
"""复制图标文本到剪贴板"""
clipboard = QApplication.clipboard()
clipboard.setText(icon_text)
self.setWindowTitle(f"已复制文本:{icon_text}")
print(f"已复制: {icon_text}")
app = QApplication(sys.argv)
w = Window()
w.show()
app.exec()
布局
多界面
以下简单示例使用QStackedWidget实现多界面程序。
from PySide6.QtCore import QFile
from PySide6.QtGui import QAction,QActionGroup
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, \
QWidget, QStackedWidget, QToolBar,QSizePolicy
class Page_1_interface(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('界面1')
def refresh(self):
print("重新调回界面1")
class Page_2_interface(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('界面2')
class SettingsDialog(QDialog):
def __init__(self, parent=None): # parent参数传递父窗口
super().__init__(parent)
self.setWindowTitle('设置界面')
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('x系统')
# 创建工具栏
toolbar = QToolBar()
self.addToolBar(toolbar)
toolbar.setMovable(False)
# 创建动作组
action_group = QActionGroup(self)
action_group.setExclusive(True)
# 创建动作
self.action_page_1 = QAction("界面1", self)
self.action_page_1.setCheckable(True)
self.action_page_1.setChecked(True)
self.action_page_1.triggered.connect(self.go_page_1)
toolbar.addAction(self.action_page_1)
action_group.addAction(self.action_page_1)
self.action_page_2 = QAction("界面2", self)
self.action_page_2.setCheckable(True)
self.action_page_2.triggered.connect(self.go_page_2)
toolbar.addAction(self.action_page_2)
action_group.addAction(self.action_page_2)
# 弹簧部件(QSpacerItem),以将设置按钮推到右侧
spacer = QWidget()
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
toolbar.addWidget(spacer)
self.action_setting = QAction("设置", self)
toolbar.addAction(self.action_setting)
self.action_setting.triggered.connect(self.show_settings_dialog)
# 创建堆叠窗口
self.stacked_widget = QStackedWidget()
# 页面1
self.page_1 = Page_1_interface()
self.stacked_widget.addWidget(self.page_1) # 添加页面1的内容
# 页面2
self.page_2 = Page_2_interface()
self.stacked_widget.addWidget(self.page_2) # 添加页面2的内容
self.setCentralWidget(self.stacked_widget)
def go_page_1(self):
# 跳转到页面1
self.stacked_widget.setCurrentWidget(self.page_1)
self.action_page_1.setChecked(True) # 高亮按钮
self.page_1.refresh() # 页面刷新函数
def go_page_2(self):
# 跳转到页面2
self.stacked_widget.setCurrentWidget(self.page_2)
self.action_page_2.setChecked(True) # 高亮按钮
def show_settings_dialog(self):
dialog = SettingsDialog(self) # 传递 self 作为父窗口
dialog.exec()
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.setMinimumSize(1000, 600)
window.show()
app.exec()
进一步封装,提高代码可维护性和扩展性:
from PySide6.QtGui import QAction, QActionGroup
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QDialog,
QStackedWidget, QToolBar, QSizePolicy)
class BasePage(QWidget):
"""页面基类"""
page_id = None # 每个页面需要指定唯一ID
def __init__(self, parent=None):
super().__init__(parent)
self.setup_ui()
def setup_ui(self):
"""子类需要实现界面初始化"""
raise NotImplementedError
def refresh(self):
"""子类可选实现刷新逻辑"""
pass
class PageManager:
"""页面管理类"""
def __init__(self, stacked_widget):
self.stack = stacked_widget
self.pages = {} # 存储页面ID与实例的映射
def register_page(self, page_cls):
"""注册页面类"""
page = page_cls(self.stack)
self.pages[page_cls.page_id] = page
self.stack.addWidget(page)
return page
def switch_to(self, page_id):
"""切换到指定页面"""
if page_id in self.pages:
page = self.pages[page_id]
self.stack.setCurrentWidget(page)
page.refresh()
return True
return False
class Page1(BasePage):
page_id = "page1"
def setup_ui(self):
self.setWindowTitle('界面1')
# 这里添加实际界面组件
def refresh(self):
print("刷新界面1")
class Page2(BasePage):
page_id = "page2"
def setup_ui(self):
self.setWindowTitle('界面2')
# 这里添加实际界面组件
class SettingsDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('设置界面')
self.setup_ui()
def setup_ui(self):
# 添加设置界面组件
pass
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('x系统')
self._setup_ui()
def _setup_ui(self):
"""初始化主界面"""
self._setup_toolbar()
self._setup_pages()
def _setup_toolbar(self):
"""初始化工具栏"""
toolbar = QToolBar()
self.addToolBar(toolbar)
toolbar.setMovable(False)
# 页面切换按钮
self.action_group = QActionGroup(self)
self.action_group.setExclusive(True)
self._create_action(toolbar, "界面1", "page1")
self._create_action(toolbar, "界面2", "page2")
# 右侧设置按钮
spacer = QWidget()
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
toolbar.addWidget(spacer)
self.action_setting = QAction("设置", self)
toolbar.addAction(self.action_setting)
self.action_setting.triggered.connect(self._show_settings)
def _create_action(self, toolbar, text, page_id):
"""创建页面切换动作"""
action = QAction(text, self)
action.setCheckable(True)
action.triggered.connect(lambda: self.page_manager.switch_to(page_id))
if not self.action_group.actions():
action.setChecked(True)
toolbar.addAction(action)
self.action_group.addAction(action)
return action
def _setup_pages(self):
"""初始化页面系统"""
self.stacked_widget = QStackedWidget()
self.setCentralWidget(self.stacked_widget)
# 初始化页面管理器
self.page_manager = PageManager(self.stacked_widget)
self.page_manager.register_page(Page1)
self.page_manager.register_page(Page2)
def _show_settings(self):
"""显示设置对话框"""
dialog = SettingsDialog(self)
dialog.exec()
if __name__ == "__main__":
app = QApplication([])
window = MainWindow()
window.setMinimumSize(1000, 600)
window.show()
app.exec()
Designer
Qt Designer是一个设计构建用户图形界面的界面化工具。在终端使用命令即可启动:
pyside6-designer
打包分发
生成可执行文件
名称 | 描述 |
---|---|
Nuitka | 常用示例:nuitka --standalone --plugin-enable=pyside6 --include-data-dir=data=data --windows-disable-console main.py 其中: --standalone --include-data-dir=data=data 数据文件夹名称为data,可以放置数据或配置文件。 --windows-disable-console ,不显示终端输出界面,开始打包可以先取消这个。
|
pyside6-deploy | Pyside 6.4开始包含pyside6-deploy打包工具,是Nuitka的封装。 |
Pyinstaller |
了解更多 >> PySide 文档:部署
资源
官网
- PySide 官网:https://www.qt.io/qt-for-python
- PySide 文档:https://doc.qt.io/qtforpython-6
- PySide Wiki:https://wiki.qt.io/Qt_for_Python