PDA

View Full Version : Styling QDockWidget's titlebar buttons



THRESHE
4th July 2008, 17:17
Hi everybody!

I need to change images of title bar buttons of a QDockWidget. The docs say that it can be done with custom QStyle.

Could anyone give me a hint ? :o

jpn
5th July 2008, 19:49
Get yourself a proxy style, reimplement QStyle::standardIcon() and return something fancy for QStyle::SP_TitleBarNormalButton and QStyle::SP_TitleBarCloseButton.

THRESHE
9th July 2008, 16:58
Thanks I'll try that :)

THRESHE
14th July 2008, 15:31
I've tried to follow your advice but it doesn't work


class MyStyle : public ProxyStyle
{
public:
MyStyle(const QString &baseStyle);

int pixelMetric(PixelMetric metric, const QStyleOption* option = 0,
const QWidget* widget = 0) const;

QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption* option = 0,
const QWidget* widget = 0) const;
};



int MyStyle::pixelMetric(PixelMetric metric, const QStyleOption* option,
const QWidget* widget) const
{
if (metric == PM_DockWidgetHandleExtent || metric == PM_DockWidgetSeparatorExtent)
{
qDebug()<<"PM_DockWidgetHandleExtent";
return 110;
}
else
return ProxyStyle::pixelMetric(metric, option, widget);
}

QIcon MyStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption* option,
const QWidget* widget) const
{
if(standardIcon == SP_TitleBarNormalButton)
return QIcon(QPixmap(":/resources/backfordropdown.jpg"));
else
return ProxyStyle::standardIcon(standardIcon, option, widget);
}

jpn
14th July 2008, 19:03
Sorry for misleading, but as QStyle::standardIcon() says:


Warning: Because of binary compatibility constraints, this function is not virtual. If you want to provide your own icons in a QStyle subclass, reimplement the standardIconImplementation() slot in your subclass instead. The standardIcon() function will dynamically detect the slot and call it.

So, switch to QStyle::standardIconImplementation()...

THRESHE
15th July 2008, 13:19
It doesn't work that way either :confused:


class MyStyle : public ProxyStyle
{
public:
MyStyle(const QString &baseStyle);

int pixelMetric(PixelMetric metric, const QStyleOption* option = 0,
const QWidget* widget = 0) const;

public slots:
QIcon standardIconImplementation(StandardPixmap standardIcon, const QStyleOption* option = 0,
const QWidget* widget = 0) const;
};



int MyStyle::pixelMetric(PixelMetric metric, const QStyleOption* option,
const QWidget* widget) const
{
if (metric == PM_DockWidgetHandleExtent || metric == PM_DockWidgetSeparatorExtent)
{
qDebug()<<"PM_DockWidgetHandleExtent";
return 110;
}
else
return ProxyStyle::pixelMetric(metric, option, widget);
}

QIcon MyStyle::standardIconImplementation(StandardPixmap standardIcon, const QStyleOption* option,
const QWidget* widget) const
{
if(standardIcon == SP_TitleBarNormalButton)
return QIcon(QPixmap(":/resources/backfordropdown.jpg"));
else
return ProxyStyle::standardIcon(standardIcon, option, widget);
}

pixelMetric also doesn't work :eek:

jpn
15th July 2008, 14:14
Your MyStyle class is missing the required Q_OBJECT macro. Make sure to re-run qmake after adding it.

THRESHE
16th July 2008, 12:30
Thanks now it works :cool: