最近,在做一个小项目时遇到画立体小球的需求,用图片感觉总是不美,于是琢磨用笔刷来做,结果试验有了一点效果。
先上图:,应该还可以吧
就是利用QRadialGradient生成笔刷然后绘制,俺对颜色不太在行,暂时只能做到这种程度!
不多说,上代码:
//生成边长length小球QPixmap图片,输出到文件到filename
void Widget::makePixmap(const QString &filename, int length)
{
//QRadialGradient球体参数
float radius = 256;
float rh2 = radius / 2.0;
float rm2 = radius * 2.0;
//Pixmap图片属性
QPixmap pixmap(rm2, rm2);
pixmap.fill(QColor(255, 255, 255, 0));
//绘制图形
QPainter p(&pixmap);
QPointF sp = QPointF(radius, radius);
QRectF br(QPointF(0.0, 0.0), QSize(rm2, rm2));
br.adjusted(2, 2, 2, 2);
QRadialGradient rg(sp, radius - 1, sp - QPointF(rh2 - 2, rh2 - 2));
rg.setColorAt(0, QColor(200, 200, 200));
rg.setColorAt(0.25, QColor(50, 200, 50));
rg.setColorAt(0.4, QColor(0, 150, 0));
rg.setColorAt(0.6, QColor(0, 120, 0));
rg.setColorAt(1, QColor(0, 80, 0));
p.setPen(Qt::NoPen);
p.setBrush(rg);
p.drawEllipse(br);
p.end();
//保存图像
pixmap = pixmap.scaled(length, length, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
pixmap.save(filename);
}
重点参考了Qt的 animatedtiles 这个例子,里面绘制按钮相当的不错(不过话说如果拿去商用是不是有问题?!是这样么?!)
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) Q_DECL_OVERRIDE
{
bool down = option->state & QStyle::State_Sunken;
QRectF r = boundingRect();
QLinearGradient grad(r.topLeft(), r.bottomRight());
//鼠标hover改变颜色
grad.setColorAt(down ? 1 : 0, option->state & QStyle::State_MouseOver ? Qt::white : Qt::lightGray);
grad.setColorAt(down ? 0 : 1, Qt::darkGray);
painter->setPen(Qt::darkGray);
painter->setBrush(grad);
painter->drawEllipse(r);
//QLinearGradient grad2(r.topLeft(), r.bottomRight());
//内圈缩小5,点击向下偏移2
grad.setColorAt(down ? 1 : 0, Qt::darkGray);
grad.setColorAt(down ? 0 : 1, Qt::lightGray);
painter->setPen(Qt::NoPen);
painter->setBrush(grad);
if (down)
painter->translate(2, 2); //点击按下 向下偏移2,2
painter->drawEllipse(r.adjusted(5, 5, -5, -5)); //向内凹陷5,显得内外有别
painter->drawPixmap(-_pix.width()/2, -_pix.height()/2, _pix);
}