PySide:修订间差异

无编辑摘要
 
第64行: 第64行:
}}
}}


==UI元素==
==常用控件==
PySide6.QtWidgets模块提供了一组UI元素,用于创建用户界面。
PySide6.QtWidgets模块提供了很多常用控件,用于创建用户界面。
 


{{了解更多
{{了解更多
第72行: 第71行:
}}
}}


== 图标 ==
=== 内置图标 ===
=== 内置图标 ===
PySide6 内置图标浏览复制
PySide6 内置图标浏览复制

2025年2月13日 (四) 02:44的最新版本

PySide是Qt公司开发的Python版GUI工具包。支持多WindowsLinuxmacOS平台。

简介

时间轴

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

了解更多 >> PySide 文档:将来自 Designer 或 QtCreator 的 .ui 文件与 QUiLoader 和 pyside6-uic 一起使用 PySide 文档:


打包分发

生成可执行文件

名称 描述
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 文档:部署


资源

官网

教程

文章