2010-03-05 12 views

Respuesta

12

través de la costumbre de proxy de estilo:

class iconned_dock_style: public QProxyStyle{ 
    Q_OBJECT 
    QIcon icon_; 
public: 
    iconned_dock_style(const QIcon& icon, QStyle* style = 0) 
     : QProxyStyle(style) 
     , icon_(icon) 
    {} 

    virtual ~iconned_dock_style() 
    {} 

    virtual void drawControl(ControlElement element, const QStyleOption* option, 
     QPainter* painter, const QWidget* widget = 0) const 
    { 
     if(element == QStyle::CE_DockWidgetTitle) 
     { 
      //width of the icon 
      int width = pixelMetric(QStyle::PM_ToolBarIconSize); 
      //margin of title from frame 
      int margin = baseStyle()->pixelMetric(QStyle::PM_DockWidgetTitleMargin); 

      QPoint icon_point(margin + option->rect.left(), margin + option->rect.center().y() - width/2); 

      painter->drawPixmap(icon_point, icon_.pixmap(width, width)); 

      const_cast<QStyleOption*>(option)->rect = option->rect.adjusted(width, 0, 0, 0); 
     } 
     baseStyle()->drawControl(element, option, painter, widget); 
    } 
}; 

ejemplo:

QDockWidget* w("my title", paretn); 
w->setStyle(new iconned_dock_style(QIcon(":/icons/icons/utilities-terminal.png"), w->style())); 
+0

Esto funciona muy bien; ¡Gracias! – Owen

1

gracias a @Owen, pero me gustaría añadir unas pocas notas, para Qt 5.7:

1 .QWidget :: setStyle() no toma el owership del objeto de estilo, por lo que necesita eliminarlo después de usarlo, o se producirá una fuga de recursos.

2.para QProxyStyle (QStyle *), QProxyStyle tomará posesión del estilo de entrada, pero w-> style() puede devolver el objeto de estilo de QApplication si no se establece su estilo personalizado. por lo

new iconned_dock_style(QIcon(":/icons/icons/utilities-terminal.png"), w->style()) 

puede tomar posesión de objeto de estilo de la aplicación, y en la destrucción, será eliminarlo. esto bloqueará la aplicación en el momento de cierre de QApplicatoin '.

por lo que ahora uso

new iconned_dock_style(QIcon(":/icons/icons/utilities-terminal.png"), NULL) 
Cuestiones relacionadas