我的QDockWidget有窗口标题和关闭按钮。如何在标题栏中放置图标?
当我从QDockWidget WindowIcon属性的资源中选择图标时,它也不起作用。
有任何想法吗?
我的QDockWidget有窗口标题和关闭按钮。如何在标题栏中放置图标?
当我从QDockWidget WindowIcon属性的资源中选择图标时,它也不起作用。
有任何想法吗?
通过自定义代理样式:
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()));
感谢@Owen,但我想为 Qt 5.7 添加一些注释:
1.QWidget::setStyle()不拥有style对象的所有权,使用后需要删除,否则会造成资源泄露。
2.对于 QProxyStyle(QStyle*),QProxyStyle 将拥有输入样式的所有权,但如果未设置自定义样式,w->style() 可能会返回 QApplication 的样式对象。所以
new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), w->style())
可能会获得应用程序样式对象的所有权,并在销毁时将其删除。这将在 QApplicatoin 的关闭时间使应用程序崩溃。
所以现在我用
new iconned_dock_style( QIcon(":/icons/icons/utilities-terminal.png"), NULL)