Qt 生成逼真的小球

4 篇文章 0 订阅

最近,在做一个小项目时遇到画立体小球的需求,用图片感觉总是不美,于是琢磨用笔刷来做,结果试验有了一点效果。

先上图:,应该还可以吧

 

就是利用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);
    }

 

 

 

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值