2010-03-05 78 views

Trả lời

12

Qua tùy chỉnh proxy-phong cách:

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

dụ:

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

này hoạt động tuyệt vời; cảm ơn! – Owen

1

nhờ @Owen, nhưng tôi muốn thêm một vài lưu ý, đối với Qt 5.7:

1 .QWidget :: setStyle() không mất quyền hạn của đối tượng kiểu, vì vậy bạn cần xóa nó sau khi sử dụng nó, hoặc nó sẽ gây ra rò rỉ tài nguyên.

2.for QProxyStyle (QStyle *), QProxyStyle sẽ sở hữu kiểu nhập, nhưng w-> style() có thể trả về đối tượng kiểu QApplication nếu kiểu tùy chỉnh của nó không được đặt. do đó

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

có thể sở hữu đối tượng kiểu của ứng dụng và khi hủy, nó sẽ xóa đối tượng. điều này sẽ làm hỏng ứng dụng trên thời gian tắt máy của QApplicatoin.

vì vậy bây giờ tôi sử dụng

new iconned_dock_style(QIcon(":/icons/icons/utilities-terminal.png"), NULL) 
Các vấn đề liên quan