Расширить стандартные значки Qt - PullRequest
0 голосов
/ 19 февраля 2011

Как расширить стандартные значки, предоставляемые классом QStyle, с учетом поддержки Windows и Linux?

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 ]

1 голос
/ 19 февраля 2011

Вы хотите создать подкласс QStyle, если хотите предоставить свои собственные значки, переопределить слот standardIconImplementation () в своем подклассе и вернуть оттуда новый значок.Ниже приведен пример:

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));

надеюсь, это поможет, с уважением

0 голосов
/ 30 апреля 2011

Начиная с 4.6, Qt может использовать тему значков freedesktop:

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

Но в Windows (и MacOS) нет тем значков. Тем не менее, вы можете использовать любую тему, какую захотите, все, что вам нужно, это поместить эту тему (или ее часть) в каталог ресурсов : / icons и выполнить в main () следующее:

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

(это взлом для QTBUG-16697 ).

...