如何在自定义样式表中使用 SP_* 图标?

Zet*_*eta 3 qt qtstylesheets

Qt 的 QStyle 提供了standardIcon,它可以在给定 StandardPixmap 值的情况下抓取标准图标:

const QStyle * style = QApplication::style();
const QIcon ok       = style->standardIcon(QStyle::SP_DialogOkButton);
Run Code Online (Sandbox Code Playgroud)

如果你想手动设置图标,这很好.setIcon,例如在 QPushButtons 或其他小部件上。但是,我想在(外部)样式表中设置图标。如果图标在 中可用:/images/ok.icon,那将很容易:

#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("Example");
    button.setStyleSheet(
        "icon-size: 32px 32px;"
        "qproperty-icon: url(:/images/ok.icon);" // <--
    );    

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

但是,我想使用style->standardIcon(QStyle::SP_DialogOkButton);,而不是资源系统中的图标。这可能吗,还是我需要手动准备所有图标?

TL; 博士

// What I have:
button.setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOkButton));

// What I want:
button.setStyleSheet(
  "qproperty-icon: url(some_url);"
);
Run Code Online (Sandbox Code Playgroud)

svl*_*sov 5

那将是标准的 Qt 图标之一:

qproperty-icon: url(:/trolltech/styles/commonstyle/images/standardbutton-apply-16.png)
Run Code Online (Sandbox Code Playgroud)

您可以在中找到所有可用的图标 qt-everywhere-opensource-src-4.8.0/src/gui/styles/images

如果我将其设置为-16.png变体,图标会正确调整大小吗?

文档说图标不会放大。您可以使用-128.png,它将根据 缩小iconSize()

此外,standardIcon 使用操作系统/窗口管理器默认图标,而 trolltech 图标不同。有没有办法做到这一点?

您可以通过 访问操作系统主题图标,QIcon::fromTheme()但这仅适用于 Linux。在 OSX 和 Windows 中,Qt 回退到资源中的标准图标。

如果你想要有多种图标大小,能够使用系统图标并且仍然从资源中回退到图标,我建议你继承 QPushButton 并添加一个新的自定义属性来处理所有事情。

Q_PROPERTY(QString my_icons_set READ iconsSet WRITE setIconsSet)
...
void setIconsSet(QString icons)
{
    // parse the string
}
Run Code Online (Sandbox Code Playgroud)

然后在 css 中,您可以执行以下操作:

qproperty-my_icons_set: "fromTheme::dialog-ok, standardIcon::SP_DialogOkButton";
Run Code Online (Sandbox Code Playgroud)