PySide6,图形按钮使用系统内置图标

系统内置图标位于:PySide6.QtWidgets.QStyle.StandardPixmap

所有的系统图标名称以及调用名:

python 复制代码
import sys
from PySide6.QtWidgets import (
    QApplication, QWidget, QPushButton, QVBoxLayout, QScrollArea, QStyle
)


class IconPreview(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QStyle 内置图标预览")
        self.setGeometry(100, 100, 400, 600)

        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        content = QWidget()
        layout = QVBoxLayout(content)

        # 遍历所有 StandardPixmap 枚举
        all_icons = [icon for icon in dir(QStyle.StandardPixmap) if icon.startswith("SP_")]
        for icon in all_icons:
            print(f"图标名称:{icon}", "调用名:", getattr(QStyle.StandardPixmap, icon),"\n")
        for name in all_icons:
            enum_val = getattr(QStyle.StandardPixmap, name)
            # icon = self.style().standardIcon(enum_val)
            icon = self.style().standardIcon(enum_val)
            btn = QPushButton(f"{name}")
            btn.setIcon(icon)
            btn.setIconSize(btn.sizeHint())
            layout.addWidget(btn)

        scroll.setWidget(content)
        main_layout = QVBoxLayout(self)
        main_layout.addWidget(scroll)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = IconPreview()
    win.show()
    sys.exit(app.exec())

图标名称:SP_ArrowBack

调用名: StandardPixmap.SP_ArrowBack

图标名称:SP_ArrowDown

调用名: StandardPixmap.SP_ArrowDown

图标名称:SP_ArrowForward

调用名: StandardPixmap.SP_ArrowForward

图标名称:SP_ArrowLeft

调用名: StandardPixmap.SP_ArrowLeft

图标名称:SP_ArrowRight

调用名: StandardPixmap.SP_ArrowRight

图标名称:SP_ArrowUp

调用名: StandardPixmap.SP_ArrowUp

图标名称:SP_BrowserReload

调用名: StandardPixmap.SP_BrowserReload

图标名称:SP_BrowserStop

调用名: StandardPixmap.SP_BrowserStop

图标名称:SP_CommandLink

调用名: StandardPixmap.SP_CommandLink

图标名称:SP_ComputerIcon

调用名: StandardPixmap.SP_ComputerIcon

图标名称:SP_CustomBase

调用名: StandardPixmap.SP_CustomBase

图标名称:SP_DesktopIcon

调用名: StandardPixmap.SP_DesktopIcon

图标名称:SP_DialogAbortButton

调用名: StandardPixmap.SP_DialogAbortButton

图标名称:SP_DialogApplyButton

调用名: StandardPixmap.SP_DialogApplyButton

图标名称:SP_DialogCancelButton

调用名: StandardPixmap.SP_DialogCancelButton

图标名称:SP_DialogCloseButton

调用名: StandardPixmap.SP_DialogCloseButton

图标名称:SP_DialogDiscardButton

调用名: StandardPixmap.SP_DialogDiscardButton

图标名称:SP_DialogHelpButton

调用名: StandardPixmap.SP_DialogHelpButton

图标名称:SP_DialogIgnoreButton

调用名: StandardPixmap.SP_DialogIgnoreButton

图标名称:SP_DialogNoButton

调用名: StandardPixmap.SP_DialogNoButton

图标名称:SP_DialogNoToAllButton

调用名: StandardPixmap.SP_DialogNoToAllButton

图标名称:SP_DialogOkButton

调用名: StandardPixmap.SP_DialogOkButton

图标名称:SP_DialogOpenButton

调用名: StandardPixmap.SP_DialogOpenButton

图标名称:SP_DialogResetButton

调用名: StandardPixmap.SP_DialogResetButton

图标名称:SP_DialogRetryButton

调用名: StandardPixmap.SP_DialogRetryButton

图标名称:SP_DialogSaveAllButton

调用名: StandardPixmap.SP_DialogSaveAllButton

图标名称:SP_DialogSaveButton

调用名: StandardPixmap.SP_DialogSaveButton

图标名称:SP_DialogYesButton

调用名: StandardPixmap.SP_DialogYesButton

图标名称:SP_DialogYesToAllButton

调用名: StandardPixmap.SP_DialogYesToAllButton

图标名称:SP_DirClosedIcon

调用名: StandardPixmap.SP_DirClosedIcon

图标名称:SP_DirHomeIcon

调用名: StandardPixmap.SP_DirHomeIcon

图标名称:SP_DirIcon

调用名: StandardPixmap.SP_DirIcon

图标名称:SP_DirLinkIcon

调用名: StandardPixmap.SP_DirLinkIcon

图标名称:SP_DirLinkOpenIcon

调用名: StandardPixmap.SP_DirLinkOpenIcon

图标名称:SP_DirOpenIcon

调用名: StandardPixmap.SP_DirOpenIcon

图标名称:SP_DockWidgetCloseButton

调用名: StandardPixmap.SP_DockWidgetCloseButton

图标名称:SP_DriveCDIcon

调用名: StandardPixmap.SP_DriveCDIcon

图标名称:SP_DriveDVDIcon

调用名: StandardPixmap.SP_DriveDVDIcon

图标名称:SP_DriveFDIcon

调用名: StandardPixmap.SP_DriveFDIcon

图标名称:SP_DriveHDIcon

调用名: StandardPixmap.SP_DriveHDIcon

图标名称:SP_DriveNetIcon

调用名: StandardPixmap.SP_DriveNetIcon

图标名称:SP_FileDialogBack

调用名: StandardPixmap.SP_FileDialogBack

图标名称:SP_FileDialogContentsView

调用名: StandardPixmap.SP_FileDialogContentsView

图标名称:SP_FileDialogDetailedView

调用名: StandardPixmap.SP_FileDialogDetailedView

图标名称:SP_FileDialogEnd

调用名: StandardPixmap.SP_FileDialogEnd

图标名称:SP_FileDialogInfoView

调用名: StandardPixmap.SP_FileDialogInfoView

图标名称:SP_FileDialogListView

调用名: StandardPixmap.SP_FileDialogListView

图标名称:SP_FileDialogNewFolder

调用名: StandardPixmap.SP_FileDialogNewFolder

图标名称:SP_FileDialogStart

调用名: StandardPixmap.SP_FileDialogStart

图标名称:SP_FileDialogToParent

调用名: StandardPixmap.SP_FileDialogToParent

图标名称:SP_FileIcon

调用名: StandardPixmap.SP_FileIcon

图标名称:SP_FileLinkIcon

调用名: StandardPixmap.SP_FileLinkIcon

图标名称:SP_LineEditClearButton

调用名: StandardPixmap.SP_LineEditClearButton

图标名称:SP_MediaPause

调用名: StandardPixmap.SP_MediaPause

图标名称:SP_MediaPlay

调用名: StandardPixmap.SP_MediaPlay

图标名称:SP_MediaSeekBackward

调用名: StandardPixmap.SP_MediaSeekBackward

图标名称:SP_MediaSeekForward

调用名: StandardPixmap.SP_MediaSeekForward

图标名称:SP_MediaSkipBackward

调用名: StandardPixmap.SP_MediaSkipBackward

图标名称:SP_MediaSkipForward

调用名: StandardPixmap.SP_MediaSkipForward

图标名称:SP_MediaStop

调用名: StandardPixmap.SP_MediaStop

图标名称:SP_MediaVolume

调用名: StandardPixmap.SP_MediaVolume

图标名称:SP_MediaVolumeMuted

调用名: StandardPixmap.SP_MediaVolumeMuted

图标名称:SP_MessageBoxCritical

调用名: StandardPixmap.SP_MessageBoxCritical

图标名称:SP_MessageBoxInformation

调用名: StandardPixmap.SP_MessageBoxInformation

图标名称:SP_MessageBoxQuestion

调用名: StandardPixmap.SP_MessageBoxQuestion

图标名称:SP_MessageBoxWarning

调用名: StandardPixmap.SP_MessageBoxWarning

图标名称:SP_RestoreDefaultsButton

调用名: StandardPixmap.SP_RestoreDefaultsButton

图标名称:SP_TabCloseButton

调用名: StandardPixmap.SP_TabCloseButton

图标名称:SP_TitleBarCloseButton

调用名: StandardPixmap.SP_TitleBarCloseButton

图标名称:SP_TitleBarContextHelpButton

调用名: StandardPixmap.SP_TitleBarContextHelpButton

图标名称:SP_TitleBarMaxButton

调用名: StandardPixmap.SP_TitleBarMaxButton

图标名称:SP_TitleBarMenuButton

调用名: StandardPixmap.SP_TitleBarMenuButton

图标名称:SP_TitleBarMinButton

调用名: StandardPixmap.SP_TitleBarMinButton

图标名称:SP_TitleBarNormalButton

调用名: StandardPixmap.SP_TitleBarNormalButton

图标名称:SP_TitleBarShadeButton

调用名: StandardPixmap.SP_TitleBarShadeButton

图标名称:SP_TitleBarUnshadeButton

调用名: StandardPixmap.SP_TitleBarUnshadeButton

图标名称:SP_ToolBarHorizontalExtensionButton

调用名: StandardPixmap.SP_ToolBarHorizontalExtensionButton

图标名称:SP_ToolBarVerticalExtensionButton

调用名: StandardPixmap.SP_ToolBarVerticalExtensionButton

图标名称:SP_TrashIcon

调用名: StandardPixmap.SP_TrashIcon

图标名称:SP_VistaShield

调用名: StandardPixmap.SP_VistaShields

所有的图标图例

设置方法:

1、基本调用:

先创建,再调用。

不同的style()有不同的风格的图标。

python 复制代码
icon = app.style().standardIcon(QStyle.StandardPixmap.SP_MediaSeekBackward)
btn1.setIcon(icon)
2、设置图标尺寸:
python 复制代码
btn2.setIconSize(QSize(10,10))  

setIconSize()只能方法显示内置图标的最大尺寸,有的是32*32,有的是128*128,超过实际尺寸也不会显示更大的。使用下面方法进行放大显示:

python 复制代码
import sys
from PySide6.QtWidgets import *
from PySide6.QtGui import QIcon, QPixmap
from PySide6.QtCore import QSize, Qt

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 300, 200)

        btn = QPushButton(self)
        btn.setGeometry(50, 50, 200, 200)

        # --------------------------
        # 1. 获取内置图标(任意SP_开头)
        # --------------------------
        icon = self.style().standardIcon(QStyle.SP_ComputerIcon)

        # --------------------------
        # 2. 把内置图标转成 pixmap 并放大
        # --------------------------
        target_size = QSize(160, 160)  # 想要多大就多大
        pixmap = icon.pixmap(target_size)  # 强制放大
        pixmap = pixmap.scaled(target_size, Qt.KeepAspectRatio, Qt.SmoothTransformation)

        # --------------------------
        # 3. 设置给按钮
        # --------------------------
        btn.setIcon(QIcon(pixmap))
        btn.setIconSize(target_size)  # 必须写

if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyWindow()
    win.show()
    sys.exit(app.exec())

这种方法图标会因为强制放大而分辨率下降。

3、图标位置

默认图标在左,可以设为右(只有左右):

python 复制代码
btn2.setLayoutDirection(Qt.LayoutDirection.RightToLeft)

图标可以间接被"挤到"文字上下:

python 复制代码
#  图标在顶部
btn.setStyleSheet("""
QPushButton {
    text-align: bottom;
    padding-bottom: 10px;   
    padding-right: 50px;     
    min-height: 80px;}
""")

但是水平方向总是位于文字的左或右侧。

使用样式表设置

使用样式表,从资源文件中调用图像,比setIcon()的方法更加灵活和好控制。

由于资源文件只支持本地资源,首先导出所有的内置图标为本地图片文件:

python 复制代码
import os
import sys

from PySide6.QtCore import QSize
from PySide6.QtWidgets import (
    QApplication, QStyle, QStyleFactory
)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    all_icons = [icon for icon in dir(QStyle.StandardPixmap) if icon.startswith("SP_")]
    all_styles = QStyleFactory.keys()
    for s in all_styles:
        style = QStyleFactory.create(s)
        for name in all_icons:
            enum_val = getattr(QStyle.StandardPixmap, name)
            icon = style.standardIcon(enum_val)
            pixmap = icon.pixmap(QSize(256,256))
            image = pixmap.toImage()
            file_path = f"E:\\2026\HMI_demo\\UI\SRC\system_icons\\{s}\\{name}.png"
            folder_path = os.path.dirname(file_path)
            # 自动创建所有缺失的文件夹
            os.makedirs(folder_path, exist_ok=True)
            # if not os.path.isfile(file_path):  # 文件不存在,创建文件
            #     with open(file_path, 'w') as file:  # 写方式打开文件
            #         file.write('')
            image.save(file_path)
    app.exit()

Windows系统,共内置了3个style:

导出后发现这3个主题的图标文件是一样的,所以用一个就够了。

把3个目录中的任意一个下的所有图片文件拷贝至UI/SRC/system_icons下,并删除3个文件夹:

打开Qt Designer,新建资源文件:

批量添加图片文件进资源文件:

关闭Qt Designer,用pyrcc工具将资源文件转为py文件:

  • 导入资源文件,并在样式表中使用image: url()调用图像资源:
python 复制代码
import os
import sys

from PySide6.QtCore import QSize
from PySide6.QtWidgets import (
    QApplication, QStyle, QStyleFactory, QPushButton
)
from UI.SRC import system_icons_rc

if __name__ == "__main__":
    app = QApplication([])
    btn = QPushButton("油泵启动")
    btn.setStyleSheet(f"""QPushButton {{
        font-size: 24px;
	    text-align:right;
	    padding-top: 10px;
	    padding-bottom: 10px;
	    padding-left: 10px;
	    padding-right: 40px;
	    /* 从 qrc 加载图片 */
	    image: url(:/icons/system_icons/SP_DialogApplyButton.png);                
	    /* 图标靠左 */
	    image-position: left center;
    }}
	""")
    btn.setFixedSize(200,60)
    btn.show()

    app.exec()
  • 使用border-image设置满幅图片:
python 复制代码
import os
import sys

from PySide6.QtCore import QSize
from PySide6.QtWidgets import (
    QApplication, QStyle, QStyleFactory, QPushButton, QWidget, QVBoxLayout
)
from UI.SRC import system_icons_rc

if __name__ == "__main__":
    app = QApplication([])
    widget = QWidget()
    layout = QVBoxLayout()
    btn = QPushButton("油泵启动")
    btn.setStyleSheet(f"""QPushButton {{
        font-size: 24px;
	    text-align:right;
	    padding-top: 10px;
	    padding-bottom: 10px;
	    padding-left: 10px;
	    padding-right: 40px;
	    /* 从 qrc 加载图片 */
	    image: url(:/icons/system_icons/SP_DialogApplyButton.png);                
	    /* 图标靠左 */
	    image-position: left center;
    }}
	""")
    btn.setFixedSize(200,60)

    btn2 = QPushButton()
    btn2.setFixedSize(80,80)
    btn2.setStyleSheet(f"""QPushButton {{ 
	    /* 从 qrc 加载图片 */
		border-image: url(:/icons/system_icons/SP_ArrowUp.png);	  
		background-color: rgb(118, 118, 118);
    }}""")

    layout.addWidget(btn2)
    layout.addWidget(btn)

    widget.setLayout(layout)
    widget.show()

    app.exec()
相关推荐
chushiyunen6 小时前
npy文件笔记
笔记·python
念恒123066 小时前
Python(列表入门)
python·学习
zjy277776 小时前
Go语言怎么用GitHub Actions_Go语言GitHub Actions教程【基础】
jvm·数据库·python
2301_782040456 小时前
如何实现SQL用户行为追踪_通过触发器记录操作明细
jvm·数据库·python
hrhcode6 小时前
【LangGraph】五.人机协作:审批和中断
python·ai·langchain·agent·langgraph
dFObBIMmai6 小时前
golang如何实现数据导入进度跟踪_golang数据导入进度跟踪实现教程
jvm·数据库·python
步辞6 小时前
golang如何实现即时通讯IM系统_golang即时通讯IM系统实现方案
jvm·数据库·python
我才是一卓6 小时前
2026 Python 入门教程,结合 vscode 和 miniforge/miniconda
开发语言·vscode·python
m0_602857766 小时前
CSS如何实现图片悬停时的缩放裁剪效果_利用transform与overflow
jvm·数据库·python