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

发布于 2024-08-23 17:49:15 字数 159 浏览 8 评论 0原文

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

当我从资源中为 QDockWidget WindowIcon 属性选择图标时,它也不起作用。

有什么想法吗?

My QDockWidget has window title and close button. How do I put icon in title bar?

When I select icon from my recources for QDockWidget WindowIcon property, it's not working either.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晨敛清荷 2024-08-30 17:49:15

通过自定义代理样式:

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

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

example:

QDockWidget* w("my title", paretn);
w->setStyle(new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), w->style()));
漆黑的白昼 2024-08-30 17:49:15

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

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

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

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

可能会拥有应用程序的样式对象的所有权,并且在销毁时,它将删除它。这将使应用程序在 QApplicatoin 关闭时崩溃。

所以现在我用

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

thanks to @Owen, but I'd like add a few notes, for Qt 5.7:

1.QWidget::setStyle() doesn't take owership of the style object, so you need delete it after using it, or it will cause a resource leak.

2.for QProxyStyle(QStyle*), QProxyStyle will take ownership of the input style,
but w->style() may return QApplication's style object if its custom style not set.
so

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

may take ownership of the app's style object, and on destruction, it will delete it. this will crash the app on QApplicatoin' shutdown time.

so now I use

new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), NULL)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文