Qt Creator Designer中的“主题”图标是如何工作的?

28

当我创建“命令链接按钮”(QCommandLinkButton)时,它有一个相对不错的绿色箭头图标。

image description

我想知道还可以选择哪些漂亮的图标。当我尝试更改图标时,出现了[主题]而不是路径或某个GUI选择对话框:

image description

我还注意到了上下文菜单:

image description

当我单击从主题设置图标时,再次期望一些GUI选择列表,但只得到一个文本字段:

image description

我所想象的是:

image description

绿色箭头是从哪个图标列表中获取的?

2个回答

10

QIcon::fromTheme只在特定条件下工作。

它可以在QIcon::themeSearchPaths()中找到QIcon::themeName()的主题。

如果所需图标不在那里,Qt Designer将无法使用任何来自主题的命名图标。

但是...如果您检查目标系统的主题搜索路径并设置主题名称,则成功的可能性更大。

示例

在Linux上,我想获取加号和减号图标。

我发现list-add.pnglist-remove.png很合适。

https://github.com/GNOME/adwaita-icon-theme/tree/master/Adwaita/16x16/actions

http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html

我在系统上进行了定位并找到了这些内容:

/usr/share/icons/gnome/16x16/actions/list-add.png
...
/usr/share/icons/gnome/32x32/actions/list-add.png
/usr/share/icons/gnome/scalable/actions/list-add.svg
/usr/share/icons/oxygen/16x16/actions/list-add.png
...

使用 fallback 图标强制使用 QIcon::fromTheme

在文件系统中找到图标:

ui->toolButton->setIcon(QIcon::fromTheme("list-add",
    QIcon("/usr/share/icons/gnome/16x16/actions/list-add.png")));

在qt资源系统中找到图标... 将图标添加到构建的qrc文件中,然后引用其路径。
ui->toolButton->setIcon(QIcon::fromTheme("list-add",
    QIcon(":/list-add.png")));

覆盖当前的图标主题

qDebug() << "themeSearchPaths:" << QIcon::themeSearchPaths() << QIcon::themeName();

// themeSearchPaths: ("/usr/local/share/icons", "/usr/share/icons", ":/icons") "hicolor"

系统默认主题和目标部署机器可能没有我想要的图标...但几乎总是安装了gnome或oxygen图标桌面主题...

QIcon::setThemeName("oxygen");

请注意,您在Qt Designer中可能看不到预览,因为它直到运行代码时才设置主题。
Gnome图标库中有1100多个图标。以下是其中的一个列表: https://gist.github.com/peteristhegreat/c0ca6e1a57e5d4b9cd0bb1d7b3be1d6a 只要您知道目标系统上可用的主题,就可以使用这个列表。
freedesktop.org上列出了286个图标。
使用Qt中包含的图标
正如@peppe指出的那样,Qt也包含70个标准图标。
widget->setIcon(widget->style()->standardIcon(QStyle::SP_BrowserReload));

http://doc.qt.io/qt-5/qstyle.html#StandardPixmap-enum

结论

在目标系统上使用股票库可能是最快的。使用Qt内置的方法很容易理解和使用,但受到限制。使用资源文件可能是最稳健的方法,并提供无限选择的图标。

确保选择标准图标包,并考虑许可和归属等其他事项。

而且线上可用的图标充足:

https://www.quora.com/What-is-the-best-icon-library

https://www.google.com/search?q=open+source+icon+library

希望这可以帮助您。


7
我认为这不是你想使用的功能。那里的“theme”名称对应于QIcon::fromTheme功能,它使用根据FDO规范命名的图标。 除非您部署自己的主题文件,否则它们在非 FDO 平台上(Windows、Mac 等)并不真正受支持。
现在 Qt 自己提供了一些库存图标;我不知道如何从 Designer 中设置它们,但是可以通过代码使用QStyle::standardIcon
 widget->setIcon(widget->style()->standardIcon(QStyle::SP_BrowserReload));

如果你需要的图标没有被Qt提供,你需要自己搭配。在这种情况下,资源系统是一种方便的方法,可以将它与可执行文件捆绑在一起。


最后但并非最不重要的,从用户体验角度考虑,除非你真的正在构建类似于Vista的向导,否则应该考虑使用QToolButton


当我要发布自己的图标时,是否可以将它们作为系统/主题图标的备选项一起发布? - Tomáš Zato
你说的是哪个平台? - peppe
我部署到Android。我想象在支持它的平台上,将使用主题图标,而在其他平台上将使用我的图标。 - Tomáš Zato
Android上的小部件并不是世界上最好的东西,但我不熟悉那里的图标主题。你可能会更幸运地深入挖掘源代码。 - peppe
你知道为什么如果我把项目转移到另一台电脑上,这个功能就无法工作吗?在Linux Mint中它可以工作,但在我的Ubuntu 14.04中却不行。图标丢失了。 - Sigur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接