1)子类化QStyle或者一个预定义的风格,这种方法很好用,Qt本身就是用这种方法为它所支持的不同平台提供基于平台的外观的
2)子类化个别的窗口部件类,并且重新实现它的绘制和鼠标事件处理器。
3)Qt 样式表
QStyle类包装应用程序外观,对于应用程序的每个窗口部件,都会使用QStyle进行绘制。
QStyle API包含绘制图形元素[drawPrimitive(),drawControl(),drawComplexControl()等]函数,样式查询函数[pixelMetrics(),styleHint(),hitTest()等]。QStyle成员函数典型的带有QStyleOption对象,它包含绘制窗口部件的通用信息(例如调色板)以及特有信息(例如按钮的文字)。
下面解析如何子类化QStyle来实现自定义外观:
子类化QStyle一般是通过重新实现几个虚函数来实现的。
1)polish(QPalette& palette):通常在此函数内指定配色方案,也即配置调色板
2)polish(QWidget*)&unpolish(QWidget*):当样式应用到窗口部件时,polish(QWidget*)就会调用,从而允许我们进行最后的定制,当动态改变样式的时候,unpolish就会调用,来撤销polish的影响。polish(QWidget*)一般用做窗口部件的事件过滤器。
3)styleHint返回关于样式外观的提示
4)pixelMetric返回像素值,来影响窗口部件的绘制
5)drawPrimitive(),drawControl(),drawComplexControl()具体的执行绘制。
如何实现自定义样式使得左侧窗口成为右侧窗口?
首先是颜色,各个窗口部件的背景色发生了变化;然后是QSpinBox的形状发生了变化,QCheckBox的选取标志发生了变化还有就是Save&Cancel按钮的位置发生了变化。即实现:带渐变背景的圆角按钮、非传统的微调框、夸张的选取标志和“棕色画刷”背景。
类声明如下:
#include <QWindowsStyle>
class BronzeStyle : public QWindowsStyle
{
Q_OBJECT
public:
BronzeStyle(){}
void polish(QPalette& palette);
void polish(QWidget* widget);
void unpolish(QWidget* widget);
int styleHint(StyleHint hint, const QStyleOption *opt, const QWidget *widget=0, QStyleHintReturn *returnData=0) const;
int pixelMetric(PixelMetric pm, const QStyleOption *option, const QWidget *widget=0) const;
void drawPrimitive(PrimitiveElement which,const QStyleOption* option,QPainter* painter,const QWidget* widget=0)const;
void drawComplexControl(ComplexControl which,const QStyleOptionComplex* option,QPainter* painter,const QWidget* widget=0)const;
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *w=0