转贴: http://www.cppblog.com/umbcom/
QT中的QStyle类提供了对QT应用程序界面的封装,QT本身也是利用它应对不同平台下的界面外观的。例如 在windowxp下 你所写的程序的默认外观是通过QT自身调用QWindowsXPStyle来实现的.既然它提供了这么方便的类用来绘制独立于应用程序功能框架的程序外观,那想对自己程序的界面进行美化人,你确实很有必要去了解一下它。
虽然QT本身提供了多种外观样式设计的方法,如QT样式表,传说是一种从CSS得到的灵感,还有另一种就是利用QGraphicsView/QGraphics Scene/QGraphics Item这种框架来绘制的程序界面。前一个虽说很好用也很强大,但我个人总觉得来的不直观。后一个功能一样强大,QT的examples and demos那个程序就是用它做的,它能做些什么就要看你的想象力了,只不过场景和场景中所有的部件你必须要自己重画,它只提供了一些简单的点.线.矩形等等,将你现有的程序移植到新的利用QGraphicsView/Scene框架制作的界面上,显然所要的时间不会是你想要的。
QStyle提供给你的则是一种丑小鸭变天鹅的方法,可能这种比喻不是很贴切,但它达到的效果确实是立竿见影,不会让你的程序有涅磐般的感觉。假设你在windows环境调试QT程序,那么在你的main函数里的return exec()之前添加这么一句:qApp->setStyle(new QPlastiqueStyle); 再启动你的程序看看,虽然这对大部分人来说并不是天鹅,但就算变天鹅application也只是需要这一句话。
我们首先要做的就是重载我们要实现的QStyle基类,它派生出了:
QMotifStyle,QWindowsStyle,QCDEStyle,QCleanlooksStyle,QPlastiqueStyle,QWindowsXPStyle等等样式,QMacStyle在Windows平台下无法使用,至少我没见过相关的示例程序.好了 我们派生的类叫MyStyle,class MyStyle : public QCleanLooksStyle.之后就是几个相关的重载函数,这几个重载的函数十分重要,他关系着你窗体绘制方式.如下:
class MyStyle : public QCleanLooksStyle
{
//以下三个函数在装载Style和卸载Style时调用,它可以是适当修改窗口部件和调色板
void polish(QPalette &palette);
void polish(QWidget *widget);
void unpolish(QWidget *widget);
//设置各部件的线宽,大小等
int pixelMetric(PixelMetric metric, const QStyleOption *option,const QWidget *widget) const;
//分别设置各种部件的布局,比如checkbox的text在左边或者在右边
int styleHint(StyleHint hint, const QStyleOption *option,const QWidget *widget, QStyleHintReturn *returnData) const;
//这个则是最重要的,在这里面你要实现对不同部件的绘制,当然你也可以调用默认的方法.
void drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const;
}