qt 之绘制 圆弧(抽奖圆盘)

 转载自:http://blog.csdn.net/liang19890820/article/details/51394007

简述

综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制。

圆形

经常地,我们会在网上看到一些列的抽奖活动,里面就有圆盘抽奖,是不是有点手痒了O(∩_∩)O~

效果

这里写图片描述

源码

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

    int radius = 150;
    int arcHeight = 30;

    // >> 1(右移1位)相当于width() / 2
    painter.translate(width() >> 1, height() >> 1);

    /**
     * 参数二:半径
     * 参数三:开始的角度
     * 参数四:指扫取的角度-顺时针(360度 / 8 = 45度)
     * 参数五:圆环的高度
     * 参数六:填充色
    **/
    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 MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{
    // 渐变色
    QRadialGradient gradient(0, 0, radius);
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1.0, color);
    painter->setBrush(gradient);

    // << 1(左移1位)相当于radius*2 即:150*2=300
    //QRectF(-150, -150, 300, 300)
    QRectF rect(-radius, -radius, radius << 1, radius << 1);
    QPainterPath path;
    path.arcTo(rect, startAngle, angleLength);

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

弧形

我们可以在之前的基础上加一些处理,从而实现一个圆弧。

效果

这里写图片描述

源码

void MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{
    // 渐变色
    QRadialGradient gradient(0, 0, radius);
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1.0, color);
    painter->setBrush(gradient);

    // << 1(左移1位)相当于radius*2 即:150*2=300
    //QRectF(-150, -150, 300, 300)
    QRectF rect(-radius, -radius, radius << 1, radius << 1);
    QPainterPath path;
    path.arcTo(rect, startAngle, angleLength);

    // QRectF(-120, -120, 240, 240)
    QPainterPath subPath;
    subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));

    // path为扇形 subPath为椭圆
    path -= subPath;

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

这些只不过是我们实现的一个小效果,如果说你有什么特殊的需要,可以在此基础上进行扩展,比如:添加文本、动画旋转等。

文本

可以通过QPainterPath的addText()来添加文本。

效果

这里写图片描述

源码

void MainWindow::gradientArc(QPainter *painter, int radius, int startAngle, int angleLength, int arcHeight, QRgb color)
{
    // 渐变色
    QRadialGradient gradient(0, 0, radius);
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1.0, color);
    painter->setBrush(gradient);

    // << 1(左移1位)相当于radius*2 即:150*2=300
    //QRectF(-150, -150, 300, 300)
    QRectF rect(-radius, -radius, radius << 1, radius << 1);
    QPainterPath path;
    path.arcTo(rect, startAngle, angleLength);

    // QRectF(-120, -120, 240, 240)
    QPainterPath subPath;
    subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));

    // path为扇形 subPath为椭圆
    path -= subPath;

    QFont font;
    font.setFamily("Microsoft YaHei");
    font.setPointSize(14);

    painter->setPen(Qt::NoPen);
    path.addText(path.pointAtPercent(0.5), font, QStringLiteral("一去丶二三里"));
    painter->drawPath(path);
}

旋转

我们对前面的圆盘进行强化,添加一个旋转效果。当然,常见的抽奖圆盘旋转的是指针,而我们下面实现的是对圆盘的旋转,如果你要实现一个抽奖转盘,那么可以再扩展。

效果

这里写图片描述

源码

// 利用定时器,定时变换角度,进行旋转。
QTimer *pTimer = new QTimer(this);
pTimer->setInterval(100);
connect(pTimer, SIGNAL(timeout()), this, SLOT(updatePaint()));
pTimer->start();

// 改变角度,进行旋转
void MainWindow::updatePaint()
{
    m_nRotationAngle++;
    if (m_nRotationAngle > 360)
        m_nRotationAngle = 0;
    update();
}

然后,只需要在绘图事件中添加简单的一行代码即可:

void MainWindow::paintEvent(QPaintEvent *)
{
    ...
    // 旋转
    painter.rotate(m_nRotationAngle);
    ...
}

好了,基本的介绍就到这里,是不是很有意思呢,O(∩_∩)O哈哈~


QT是一个跨平台的应用程序开发框架,它允许开发者创建丰富的用户界面和复杂的图形处理应用。要在QT绘制五分之一圆弧,你可以利用`QPainter`类及其提供的绘图功能。 以下是一个简化的步骤来帮助你在QT绘制五分之一圆弧: ### 步骤 1: 设置画布 首先,在你的QWidget或其他支持绘制的对象内部设置一个`QPainter`对象。通常,你会通过调用`paintEvent`槽函数或直接在特定位置调用`drawArc`等方法来实现这一目标。 ```cpp void YourWidget::paintEvent(QPaintEvent *) { QPainter painter(this); // 其他画笔和背景色设置... } ``` ### 步骤 2: 绘制五分之一圆弧 QT绘制圆弧的基本语法如下: ```cpp painter.drawArc(rectX, rectY, width, height, startAngle, spanAngle) ``` 其中: - `rectX`, `rectY`: 圆弧所在的矩形区域的左上角坐标; - `width`, `height`: 矩形区域的宽度和高度; - `startAngle`: 圆弧开始的角度(从0度开始计算),单位为十进制度数; - `spanAngle`: 圆弧覆盖的角度长度(同样以十进制度数表示); 为了绘制五分之一圆弧,你需要指定开始角度、结束角度以及对应的跨度角度。 由于我们需要绘制五分之一圆弧,我们可以假设起点为(90度)开始,并选择适当的角度跨度使得总角度接近于180度(即半个圆)。例如,如果我们要绘制从45度到135度的部分,可以这样做: ```cpp // 假设宽高等于半径 * 2,因此我们只需要指定半径即可 int radius = 50; // 半径 int centerX = rectX + radius; int centerY = rectY + radius; // 开始角度为45度 int startAngle = 45; // 覆盖的角度长度为90度(半个圆弧的一半) int spanAngle = 90; painter.setPen(Qt::blue); // 设置线条颜色 painter.drawArc(centerX - radius, centerY - radius, 2*radius, 2*radius, startAngle * 16, spanAngle * 16); ``` 注意,角度转换为QT中的十六进制角度表示需要乘以16,因为QT内部使用的是一种基于字节的度量系统。 ### 相关问题: 1. **如何调整圆弧的颜色和宽度**? 可以通过设置`painter.setPen()`的参数来调整颜色和宽度,如: ```cpp painter.setPen(QPen(Qt::red, 2)); // 设置红色线条,宽度为2像素 ``` 2. **能否添加阴影效果到圆弧**? 对于简单的阴影效果,可以使用渐变填充配合`painter.setBrush()`方法。然而,要添加更复杂的效果,比如模糊阴影,可能需要使用OpenGL或者第三方库。 3. **在动态大小的窗口中保持圆弧的比例不变**? 当窗口大小改变时,保持圆弧相对于其容器大小的比例不变可以通过在事件处理器中获取当前窗口尺寸并相应地调整圆心坐标和边界进行计算。例如: ```cpp int newRadius = std::min(width(), height()) / 2; // 新的半径为较小边长的一半 int newX = width() / 2; int newY = height() / 2; // 使用新中心点和新的半径值来计算圆弧 ``` 这提供了一个基本的框架和指导原则用于在QT应用程序中绘制五分之一圆弧。通过这种方式,你可以进一步自定义和优化你的圆形绘制需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值