2010-03-05 14 views

Antwort

12

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

Beispiel:

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

Dies funktioniert gut; Vielen Dank! – Owen

1

dank @Owen, aber ich würde ein paar Notizen gerne hinzufügen, für Qt 5.7:

1 .QWidget :: setStyle() nimmt keine Owership des Stilobjekts, also müssen Sie es löschen, nachdem Sie es verwenden, oder es wird ein Ressourcenleck verursachen.

2.für QProxyStyle (QStyle *), QProxyStyle übernimmt die Eigentümerschaft für den Eingabe-Stil, , aber w-> style() kann das QApplication-Stilobjekt zurückgeben, wenn sein benutzerdefinierter Stil nicht gesetzt ist. so

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

Eigentum an den Stil Objekt nehmen kann App und auf Zerstörung, wird es gelöscht werden. Dies führt zum Absturz der App bei QApplicato während des Herunterfahrens.

so jetzt verwende ich

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