2010-03-05 9 views

risposta

12

Attraverso personalizzato proxy-style:

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

esempio:

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

Questa grande opera; Grazie! – Owen

1

grazie a @Owen, ma vorrei aggiungere qualche nota, per Qt 5.7:

1 .QWidget :: setStyle() non accetta il proprietario dell'oggetto stile, quindi è necessario eliminarlo dopo averlo utilizzato, oppure causerà una perdita di risorse.

2.for QProxyStyle (QStyle *), QProxyStyle sarà assumere la proprietà dello stile di input, ma w-> stile() può restituire oggetto lo stile di QApplication se il suo stile personalizzato non impostato. così

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

può assumere la proprietà dell'oggetto stile di applicazione, e alla distruzione, sarà eliminarlo. questo causerà il crash dell'applicazione su QApplicatoin 'shutdown time.

così ora uso

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