扩展Qt标准图标

时间:2011-02-19 12:53:34

标签: c++ qt qt4 cross-platform icons

如何在支持Windows和Linux的情况下扩展QStyle类提供的标准图标?

namespace Ui {
  class TVLoader;
}

class TVLoader : public QMainWindow
{
  Q_OBJECT

public:
  explicit TVLoader(QWidget *parent = 0) :
  QMainWindow(parent),
  ui(new Ui::TVLoader)
{
  ui->setupUi(this);
  ui->actionAdd_TV_Show->setIcon(style()->standardIcon(?)); // this is where I would need some kind of "Add" icon which unfortunately doesn't exist
}

2 个答案:

答案 0 :(得分:1)

如果您想提供自己的图标,重新实现子类中的standardIconImplementation()插槽并从那里返回一个新图标,那么您想要继承QStyle的子类。以下是一个例子:

class MyProxyStyle : public QProxyStyle
{
    Q_OBJECT

public:
    MyProxyStyle(QStyle *style = 0) : QProxyStyle(style) { }

public slots:
    QIcon standardIconImplementation(StandardPixmap standardIcon,
                                     const QStyleOption *option = 0,
                                     const QWidget *widget = 0) const
    {
        // check the standardIcon parameter for the icon type 
        if (standardIcon==QStyle::SP_DesktopIcon)
        {
            // return your new icon here
            standardIcon = QStyle::SP_DirIcon;
        }
        return QProxyStyle::standardIconImplementation(standardIcon, option, widget);
    }
};

这是你如何使用它:

// set new style for your widget
setStyle(new MyProxyStyle(style()));
// return different icon for QStyle::SP_DesktopIcon
action0->setIcon(style()->standardIcon(QStyle::SP_DesktopIcon));

希望这有帮助,尊重

答案 1 :(得分:0)

从4.6开始,Qt可以使用freedesktop图标主题:

QIcon undo_icon = QIcon::fromTheme("edit-undo");

但Windows(和MacOS)中没有图标主题。但是,您可以使用任何您想要的主题,您只需将此主题放入:/ icons 资源目录(或其中的一部分)并在main()中执行以下操作:

if (!QIcon::hasThemeIcon("document-open")) {
    QIcon::setThemeName("/");
}

(这是QTBUG-16697的黑客攻击。)