16,235
社区成员
发帖
与我相关
我的任务
分享
#include <QWindowsStyle>
class newStyle : public QWindowsStyle
{
Q_OBJECT
public:
newStyle();
virtual int pixelMetric(PixelMetric pm, const QStyleOption * opt=0, const QWidget * widget=0) const; //重载函数
virtual void drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget=0) const; //重载函数
private:
void diyScrollBar(const QStyleOptionComplex *opt, QPainter *p) const; //重画滚动条
private:
QPixmap *m_pBkPixmap;
QPixmap *m_pHndPixmap;
};
#include <QtGui>
#include "newstyle.h"
/*
* 函数介绍:构造函数
图片变量赋值
* 输入参数:无
* 输出参数:无
* 返回值 :无
*/
newStyle::newStyle()
: m_pBkPixmap(NULL), m_pHndPixmap(NULL)
{
m_pBkPixmap = new QPixmap("./skin/scrollbar_background.png"); //滚动条背景
m_pHndPixmap = new QPixmap("./skin/scrollbar_handle.png"); //滚动条滑块
}
/*
* 函数介绍:像素公制
* 输入参数:pm,像素公制;opt,选项;widget,控件
* 输出参数:无
* 返回值 :调整值
*/
int newStyle::pixelMetric(PixelMetric pm, const QStyleOption * opt, const QWidget * widget) const
{
switch (pm)
{
case PM_ScrollBarExtent: //宽
return 13;
case PM_ScrollBarSliderMin: //最小高
return 15;
default:
return QWindowsStyle::pixelMetric(pm, opt, widget);
}
}
/*
* 函数介绍:画复杂控件
* 输入参数:cc,复杂控件;opt,选项;p,画具;widget,控件
* 输出参数:无
* 返回值 :调整值
*/
void newStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget) const
{
if (CC_ScrollBar == cc)
{
diyScrollBar(opt, p);
}
else
{
return QWindowsStyle::drawComplexControl(cc, opt, p, widget);
}
}
void newStyle::diyScrollBar(const QStyleOptionComplex *opt, QPainter *p) const
{
QRect scrollbarRect = opt->rect;
p->save();
p->setClipRect(scrollbarRect, Qt::IntersectClip);
QRect rectSubCtrlGroove = subControlRect(CC_ScrollBar, opt, SC_ScrollBarGroove); //获取子控件的RECT
QRect rectSubCtrlHandle = subControlRect(CC_ScrollBar, opt, SC_ScrollBarSlider); //获取子控件的RECT
QRect rectAddLine = subControlRect(CC_ScrollBar, opt, SC_ScrollBarAddLine);
QRect rectSubLine = subControlRect(CC_ScrollBar, opt, SC_ScrollBarSubLine);
QRect rectAddPage = subControlRect(CC_ScrollBar, opt, SC_ScrollBarAddPage);
QRect rectSubPage = subControlRect(CC_ScrollBar, opt, SC_ScrollBarSubPage);
if (scrollbarRect.width() < scrollbarRect.height()) //垂直滚动条
{
//画按钮部分
QRect rectDownPix(0, m_pBkPixmap->height()-13, 13, 13);
p->drawPixmap(rectAddLine, *m_pBkPixmap, rectDownPix);
p->drawPixmap(rectSubLine, *m_pBkPixmap, rectSubLine);
//画底色部分
QRect rectBodyPix(0, 13, 13, m_pBkPixmap->height()-26);
p->drawPixmap(rectSubCtrlGroove, *m_pBkPixmap, rectBodyPix);
//画滑块部分
QRect rectHandleA(0, 0, 13, 5);
QRect rectHandleCenter(0, 5, 13, 90);
QRect rectHandleB(0, 95, 13, 5);
QRect rectToDrawBegin(0, rectSubCtrlHandle.top(), 13, 5);
QRect rectToDrawCenter(0, rectSubCtrlHandle.top()+5, 13, rectSubCtrlHandle.height()-10);
QRect rectToDrawEnd(0, rectSubCtrlHandle.bottom()-5, 13, 5);
if (m_pHndPixmap)
{
p->drawPixmap(rectToDrawBegin, *m_pHndPixmap, rectHandleA);
p->drawPixmap(rectToDrawCenter, *m_pHndPixmap, rectHandleCenter);
p->drawPixmap(rectToDrawEnd, *m_pHndPixmap, rectHandleB);
}
}
else //水平滚动条
{
//将图片翻转一下
QMatrix matrix;
matrix.rotate(-90.0);
QPixmap hBkPixmap;
QPixmap hHndPixmap;
hBkPixmap = m_pBkPixmap->transformed(matrix);
hHndPixmap = m_pHndPixmap->transformed(matrix);
//画按钮部分
QRect rectToDrawDown(hBkPixmap.width()-13, 0, 13, 13);
p->drawPixmap(rectAddLine, hBkPixmap, rectToDrawDown);
p->drawPixmap(rectSubLine, hBkPixmap, rectSubLine);
//画底色部分
QRect rectBodyPix(13, 0, hBkPixmap.width()-26, 13);
p->drawPixmap(rectSubCtrlGroove, hBkPixmap, rectBodyPix);
//画滑块部分
QRect rectHandleA(0, 0, 5, 13);
QRect rectHandleCenter(5, 0, 90, 13);
QRect rectHandleB(95, 0, 5, 13);
QRect rectToDrawBegin(rectSubCtrlHandle.left(), 0, 5, 13);
QRect rectToDrawCenter(rectSubCtrlHandle.left()+5, 0, rectSubCtrlHandle.width()-10, 13);
QRect rectToDrawEnd(rectSubCtrlHandle.right()-5, 0, 5, 13);
if (m_pHndPixmap)
{
p->drawPixmap(rectToDrawBegin, hHndPixmap, rectHandleA);
p->drawPixmap(rectToDrawCenter, hHndPixmap, rectHandleCenter);
p->drawPixmap(rectToDrawEnd, hHndPixmap, rectHandleB);
}
}
p->restore();
}