首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt对圆弧开展颜色渐变

2014-01-08 
Qt对圆弧进行颜色渐变部分高手指点迷津。#ifndef GRADIENTARC_H#define GRADIENTARC_H#include QWidgetcl

Qt对圆弧进行颜色渐变


部分
Qt对圆弧开展颜色渐变


高手指点迷津。

#ifndef GRADIENTARC_H
#define GRADIENTARC_H

#include <QWidget>

class GradientArc : public QWidget {
    Q_OBJECT
public:
    explicit GradientArc(QWidget *parent = 0);

protected:
    virtual void paintEvent(QPaintEvent *event);

private:
    void gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color);
};

#endif // GRADIENTARC_H

#include "GradientArc.h"
#include <QPainter>
#include <QRadialGradient>
#include <QPainterPath>

GradientArc::GradientArc(QWidget *parent) : QWidget(parent) {
}

void GradientArc::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    int radius = 150;
    int arcHeight = 30;

    painter.translate(width()>>1, height()>>1);

    gradientArc(&painter, radius, 0,  45, arcHeight, qRgb(200, 200, 0));
    gradientArc(&painter, radius, 45, 45, arcHeight, qRgb(200, 0, 200));
    gradientArc(&painter, radius, 90, 45, arcHeight, qRgb(0, 200, 200));
    gradientArc(&painter, radius, 135, 45, arcHeight, qRgb(200, 0, 0));
    gradientArc(&painter, radius, 225, 45, arcHeight, qRgb(0, 200, 0));
    gradientArc(&painter, radius, 180, 45, arcHeight, qRgb(0, 0, 200));
    gradientArc(&painter, radius, 270, 45, arcHeight, qRgb(0, 0, 0));
    gradientArc(&painter, radius, 315, 45, arcHeight, qRgb(150, 150, 150));
}

void GradientArc::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color) {
    QRadialGradient gradient(0, 0, radius);
    gradient.setColorAt(0, qRgb(255, 255, 255));
    gradient.setColorAt(1.0, color);
    painter->setBrush(gradient);

    QRectF rect(-radius, -radius, radius<<1, radius<<1);
    QPainterPath path;
    path.arcTo(rect, startAngle, angleLength);

    QPainterPath subPath;
    subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));
    path -= subPath;

    painter->setPen(Qt::NoPen);
    painter->drawPath(path);
}

[解决办法]
LZ要的应该是5楼这样的效果,用QConicalGradient类即可。

热点排行