如何在QDockWidget标题栏中显示图标?

时间:2010-03-05 12:09:16

标签: qt qt-designer

我的 QDockWidget 有窗口标题和关闭按钮。如何在标题栏中添加图标?

当我从 QDockWidget WindowIcon 属性的资源中选择图标时,它也无效。

有什么想法吗?

3 个答案:

答案 0 :(得分:12)

通过自定义代理风格:

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

示例:

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

答案 1 :(得分:1)

答案 2 :(得分:1)

感谢@Owen,但我想为Qt 5.7添加一些注释:

1.QWidget :: setStyle()没有使用样式对象的所有权,因此您需要在使用后将其删除,否则会导致资源泄漏。

2.对于QProxyStyle(QStyle *),QProxyStyle将获得输入样式的所有权, 但是如果未设置自定义样式,则w-&gt; style()可能会返回QApplication的样式对象。 所以

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

可能拥有应用程序的样式对象的所有权,并且在销毁时,它将删除它。这将使QApplicatoin&#39;上的应用程序崩溃关机时间。

现在我用

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