前言

  关于 Qt 内置的 图标 ,之前开发 Unreal FBX 导入导出面板的时候就已经研究过了。 链接
  但是当时没有系统整理这个图标的获取方法,最近又遇到类似的问题,就特别扩展延伸了一下。

内置图标查找

  遇到问题,首先在网络上查找,可以在 Stack Overflow 上找到不错的回答 链接

  链接里面提到的第一个回答是使用 theme 可以获取 gtk 的默认图标。
  但是这个操作在 windows 平台不起作用,我也不知道怎么在 windows 上实现。
  于是我参考了第二个回答,还是有所收获的, Qt 内置了72个图标(后面研究有些图标是不可用的)。
  基本可以满足大部分的需要了。

QStyle 获取内置图标

  Qt 的内置图标可以在 PySide 的文档里面找到 链接

文档图标

  当初我开发 FBX 导入导出面板的时候还没有整理,所以要用什么图标只能看描述,然后一个一个图标测试。
  现在想着不如直接做个 Widget 将所有的图标罗列出来吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- coding: utf-8 -*-
"""
罗列 Qt 内置的图标
"""

from __future__ import division
from __future__ import print_function
from __future__ import absolute_import

__author__ = 'timmyliang'
__email__ = '820472580@qq.com'
__date__ = '2020-07-18 23:29:36'

import os
from functools import partial
from PySide2 import QtCore, QtWidgets, QtGui

class IconWidget(QtWidgets.QWidget):

def __init__(self,parent=None):
super(IconWidget, self).__init__(parent)
DIR = os.path.dirname(__file__)

layout = QtWidgets.QHBoxLayout()
self.setLayout(layout)
style = QtWidgets.QApplication.style()

container = QtWidgets.QWidget()
container.setLayout(QtWidgets.QVBoxLayout())
layout.addWidget(container)

index = 0
for attr in dir(QtWidgets.QStyle):
if not attr.startswith("SP_"):
continue

index += 1
ref = getattr(QtWidgets.QStyle,attr)

# # NOTE 保存图片到本地
# pixmap = style.standardIcon(ref).pixmap(32,32) if attr == "SP_LineEditClearButton" else style.standardPixmap(ref)
# icon_folder = os.path.join(DIR,"icon")
# if not os.path.exists(icon_folder):
# os.makedirs(icon_folder)
# path = os.path.join(icon_folder,"%s.png" % attr)
# pixmap.save(path,"png")

icon = style.standardIcon(ref)
button = QtWidgets.QPushButton()
button.setIcon(icon)
button.setText(attr)
button.clicked.connect(partial(self.copy_text,"QtWidgets.QStyle.%s" % attr))
container.layout().addWidget(button)

if index % 18 == 0:
container = QtWidgets.QWidget()
container.setLayout(QtWidgets.QVBoxLayout())
layout.addWidget(container)

def copy_text(self,text):
cb = QtWidgets.QApplication.clipboard()
cb.clear(mode=cb.Clipboard )
cb.setText(text, mode=cb.Clipboard)

def main():
app = QtWidgets.QApplication([])
widget = IconWidget()
widget.show()
app.exec_()

if __name__ == "__main__":
main()

内置图标

  加了个贴心的小功能,点击图标自动复制图标的类名到剪切板里面。
  方便将中意的图标拿出来用。
  另外整理一份 md 文档列表,图标文件也已经上传到 github 上了。

内置图标

github地址

总结

  Qt 框架真的非常庞大,而且跨平台,功能强大。
  只可惜这个内置图标提供的数量比较少,当然如果不嫌麻烦,Qt也提供了和多方便的 API 来外部调用图标,满足各种需求。