精华内容
下载资源
问答
  • 2017-09-21 18:22:23
    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing,true);
        painter.rotate(m_nRotationAngle); // 顺时针旋转坐标系
    
        QRadialGradient gradient(0,0,90);   //设置渐变
        gradient.setColorAt(0,QColor(200,180,20));
        gradient.setColorAt(0.5,QColor(20,220,110));
        gradient.setColorAt(1.0,QColor(180,60,150));
        painter.setBrush(gradient);
    
        painter.setPen(Qt::NoPen);  //设置画笔
    
        QRectF rectf(-90,-90,90 << 1,90 << 1);
    
        QPainterPath path;
        path.arcTo(rectf,30,70);
    
        painter.translate(width()/3,height() /3);  // 偏移坐标(0,0)位置
        painter.drawPath(path);   //画路径(扇形)
    
        painter.translate(0,height() /3);  // 偏移坐标(0,0)位置
        painter.drawPie(rectf,30*16,70*16);  //画扇形
    
    }



    更多相关内容
  • 使用QPainter的2D绘图画扇形方式实现一个模拟时钟,从中可以对Qt的坐标系有初步理解。同时学习如何画扇形
  • qt绘画扇形drawPie()和反着三角函数qAcos() 问题背景: 在绘画进度条控件中,进度滑块当处于一开始和快完成,有弧度部分的时候,想要看的过程比较自然,就要自己手动填充这一部分"梯形(腰是两个段圆弧)";而一...

    简介: qt绘画扇形drawPie(),绘画出弧线; 和由三角形的长度计算出角度,利用反三角函数qAcos()

    同步博文:


    问题背景:

    在绘画进度条控件中,进度滑块当处于一开始和快完成,有弧度部分的时候,想要看的过程比较自然,就要自己手动填充这一部分"梯形(腰是两个段圆弧)";而一开始想到的居然是:直接求直线于弧线(圆角矩形的弧线部分)的交点的函数,我觉得应该是没有的。


    解决方法:

    “腰是圆弧梯形” 拆分为一个两个圆弧和一个(标准)等腰梯形来进行拆分,从而进行填。

    其中需要计算角度

    绘画扇形drawPie():

    void QPainter::drawPie(const QRect &, int a, int alen)
    参数1: 圆弧的圆心所处于矩形
    参数2: 圆弧的开始始的角度°(单位1/16度)
    参数3: 圆弧的转动的角度°(单位1/16度)

    实际使用,注意其单位是1/16角度,而不是弧度

    p->drawPie(topPointRect,41 * 16, (90 - 41) * 16);
    

    反三角计算角度qAcos():

    由三角形的边计算角度;需要包含头文件

     #include <QtMath>
    

    另外一个计算角度的函数

    qreal qAcos(qreal v)
    Returns the arccosine of v as an angle in radians. Arccosine is the inverse operation of cosine.
    参数: 直角边/斜边 (注意用double)
    返回结果: 是弧度为单位

    使用:

    qreal raw = qAcos(30 * 1.0 / 40);   //=41.4096弧度
    

    弧度和角度转换公式:

    弧度 = 角度 * π / 180

    π所对应的宏为:

    //M_PI	The ratio of a circle's circumference to diameter, π
    

    绘画上图的黑色圆弧代码:

    qreal raw = qAcos(30 * 1.0 / 40);
    int startRadius = raw * 180 / M_PI;
    p->drawPie(topPointRect,startRadius * 16, (90 - startRadius) * 16);
    

    最后的效果:

    如图:然后同理,只需要将左侧的两个角都这样计算,然后同样填充蓝色,即可以做到圆角处的完美(当进度增加时候,加载想的自然)

    展开全文
  • Qt QML 基于画布的扇形的进度条1. 演示2. 实现过程 所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧! GIT工程文件在这里:     QmlLearningPro ,编译选择 ...

    Qt QML 基于画布的扇形的进度条


    所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧!

    GIT工程文件在这里:     QmlLearningPro编译选择 CanvasSector

    QML其它文章请点击这里:     QT QUICK QML 学习笔记


    1. 演示

    效果如下:
    在这里插入图片描述

    2. 实现过程

    1. 先看下静态的扇形如何显示:

    画板提供了arc() 函数来实现扇形区域:

    object arc(real x, real y, real radius, real startAngle, real endAngle, bool anticlockwise)
    

    以圆点(x, y)、半径 radius 的圆周上画弧, startAngle 和 endAngle都是从x轴开始以弧度测量的。以下为官方帮助文档的截图:
    在这里插入图片描述
    所以,我们先画一个最简单的扇形

    Canvas{ ///画布
        id: _canvas
        width: 200
        height: 200
        anchors.margins: 50
        anchors.centerIn: parent
        contextType:  "2d";
        onPaint: {
            var ctx = getContext("2d");  ///画师
            ctx.fillStyle = "red"
            ctx.save();                 //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
            ctx.beginPath();
            //移动画笔到100,100位置
            ctx.moveTo(100,100);
            //原点在100,100,半径为100 ——> 起始度数为180  结束度数270
            ctx.arc(100, 100, 100, 180*Math.PI/180, 270 * Math.PI/180);
            ctx.closePath();
            ctx.fill()
            ctx.restore();
        }
    

    运行如下:
    在这里插入图片描述

    2. 实现了一个扇形后,再实现多个扇形:

    function paintPer(ctx,x,y, r, startAngle,endAngle, color) {
        ctx.fillStyle = color
        ctx.save();         //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
        ctx.beginPath();
        ctx.moveTo(x,y);
        ctx.arc(x,y,r,startAngle*Math.PI/180, endAngle*Math.PI/180);
        ctx.closePath();
        ctx.fill()
        ctx.restore();
    }
    
    onPaint: {
        var ctx = getContext("2d");  ///画师
        //外层底图
        paintPer(ctx,100,100,100,180,360,'grey')
        //外层动图:  angle就是显示的目标角度
        paintPer(ctx,100,100,100,180,angle,'black')
        //中间空白层
        paintPer(ctx,100,100,75,0,360,"white")
        //内层底图
        paintPer(ctx,100,100,66,180,360,'#EEE8CD')
        //内层动图 angle就是显示的目标角度
        paintPer(ctx,100,100,66,180,angle,'#EEB422')
        //内层空白层
        paintPer(ctx,100,100,63,0,360,"white")
    }
    

    如下:
    在这里插入图片描述

    3. 数据源:

    //currentValue:   0%~100%
    property real currentValue : 0
    //angle:         180°~360°   //180°为100份
    property real angle: (currentValue * 180 / 100 + 180)
    
    Timer{
        id: timer
        interval: 20;
        running: true;
        repeat:     true;
        onTriggered: {
            if(currentValue === 100) {
                currentValue = 0;
            }
            currentValue += 1;
        }
    }
    

    完整代码

    import QtQuick 2.12
    import QtQuick.Window 2.12
    import QtQuick.Controls 1.4
    
    Window {
        id: root
        visible: true
        width: 400
        height: 200
        title: qsTr("Canvas For Sector")
    
        //currentValue:   0%~100%
        property real currentValue : 0
        //angle:         180°~360°   //180°为100份
        property real angle: (currentValue * 180 / 100 + 180)
    
        onCurrentValueChanged: _canvas.requestPaint();
    
        Canvas{ ///画布
            id: _canvas
    
            width: 200
            height: 200
            anchors.margins: 50
            anchors.centerIn: parent
    
            Timer{
                id: timer
                interval: 20;
                running: true;
                repeat:     true;
                onTriggered: {
                    if(currentValue === 100) {
                        currentValue = 0;
                    }
                    currentValue += 1;
                }
            }
    
            contextType:  "2d";
    
            function paintPer(ctx,x,y, r, startAngle,endAngle, color) {
    
                ctx.fillStyle = color
                ctx.save();         //ctx.save() 和 ctx.restore(); 搭配使用是清除画板的
                ctx.beginPath();
                ctx.moveTo(x,y);
                ctx.arc(x,y,r,startAngle*Math.PI/180, endAngle*Math.PI/180);
                ctx.closePath();
                ctx.fill()
                ctx.restore();
            }
    
            onPaint: {
                var ctx = getContext("2d");  ///画师
                //外层底图
                paintPer(ctx,100,100,100,180,360,'grey')
                //外层动图:  angle就是显示的目标角度
                paintPer(ctx,100,100,100,180,angle,'black')
                //中间空白层
                paintPer(ctx,100,100,75,0,360,"white")
                //内层底图
                paintPer(ctx,100,100,66,180,360,'#EEE8CD')
                //内层动图 angle就是显示的目标角度
                paintPer(ctx,100,100,66,180,angle,'#EEB422')
                //内层空白层
                paintPer(ctx,100,100,63,0,360,"white")
            }
    
            //可以文字,可以图片
            Text {
                id: txt_progress
                anchors.bottom: parent.bottom
                anchors.bottomMargin: 100
                anchors.horizontalCenter: parent.horizontalCenter
    
                font.pixelSize: 26  //16
                font.bold:      true
    
                text: currentValue.toString() + "%"
                color: 'black'
            }
        }
    }
    

    GIT 工程文件点击这里:     QmlLearningPro编译选择 CanvasSector

    QML 其它文章请点击这里:     QT QUICK QML 学习笔记

    展开全文
  • QT绘制同心扇形(Paintevent实现)

    千次阅读 2020-11-04 10:54:40
    Qt使用paintevent实现同心扇形,网上有很多绘制同心圆的,但是在实际使用中我们往往需要绘制同心扇形进行制作饼图。 实现原理大致是设置2个扇形,一个大扇形,一个小扇形,小扇形将大扇形不需要的部分进行覆盖,就...

    Qt使用paintevent实现同心扇形,网上有很多绘制同心圆的,但是在实际使用中我们往往需要绘制同心扇形进行制作饼图。
    实现原理大致是设置2个扇形,一个大扇形,一个小扇形,小扇形将大扇形不需要的部分进行覆盖,就可以实现了。
    网上说了扇形的3个参数:
    1.绘制扇形的矩形框(扇形的大小在这个范围内)
    2.扇形的开始位置(一定要用度数16)
    3.代表需要移动多少度(也需要乘16)网上大部分说是结束位置,但是经过我测试之后发现不是
    它默认的是逆时针代表正角度(-90
    16就是代表在当前位置顺时针移动90)
    代码

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::transparent,4,Qt::SolidLine));
        painter.setBrush(QBrush(QColor("red")));
        QRect rect(0,0,200,200);
        QRect rect1(50, 50, 100, 100);
        painter.drawPie(rect,270*16,-90*16);
        painter.setBrush(QBrush(QColor("white")));
        painter.drawPie(rect1,270*16,-90*16);
    }
    

    效果图:
    在这里插入图片描述
    喜欢的记得点赞。Bye

    展开全文
  • qt5.3 实现量角器

    2017-11-03 10:34:54
    qt 实现量角器刻度尺,可翻转、移动、自由放大缩小、旋转,画扇形等操作,源码直接编译运行即可。
  • DarwArc(QRect,startAngle, endAngle) 这个Rect怎么设置圆心和半径呢,开始角结束角都好说,就是不位置不对,死活对不到点了 目的是经过两个点画弧线,第三个点做圆心? 这个圆心和半径怎么做?...
  • Qt扇形都是逆时针方向的,如果我们想汽车仪表那种顺时针方向的扇形呢? Qt绘制基本扇形的核心代码: QRectF rectangle(10.0, 20.0, 80.0, 60.0);//设定扇形所在的矩形,扇形画在矩形内部 int startAngle = ...
  • IFeatureClassfeatureClass=GetLayerByName("摄像头").FeatureClass; IFeaturefeatureForDraw; IFeatureCursortmpcur=Base.QueryElement(featureClass,""); ...
  • 本次介绍主要有画弦、矩形、圆、椭圆、QPainterPath一次性画多个、画贝塞尔曲线、画扇形、画弧、裁剪、掩码等。 一、画弦 Widget::Widget(QWidget *parent) : QWidget(parent) { setAutoFillB...
  • Qt——扇形渐变

    千次阅读 2018-08-13 21:58:51
  • QT中的绘图操作

    千次阅读 2022-01-26 00:09:35
    想到哪就去哪,但是必须是直的 drawPicture() 按QPainter指令绘制 区分drawImage、drawPixmap drawPie() 扇形 drawPixmap() 图像 drawPoint() 点 drawPoints() 多个点 drawPolygon()多边形 drawPolyline() 多折线 ...
  • Qt 渐变绘制

    2021-09-05 00:40:08
    Qt填充渐变颜色: QBrush支持三种渐变方式: 通过QLinearGradient, QConicalGradient, QRadialGradient构造渐变QBrush 源码: void PainterWidget::paintEvent(QPaintEvent *event) { QPainter painter(this...
  • Qt绘制和填充

    2022-04-15 16:42:12
    1. 基本图形的绘制例程和代码 2. 绘制风格 2.1 画笔风格 2.2 画笔端点风格 2.3 画笔连接风格 2.4 刷风格 2.5 线性渐变的3中扩散结果 2.6 辐射渐变的3种扩散结果 2.7 锥形渐变
  • 参考链接: QT 自定义控件之速度表盘_黑塞的博客-CSDN博客
  • QPen(tMenuCtrlStyles.cBkgBorderClrs,tMenuCtrlStyles.dBkgBordersWid):Qt::NoPen); if(this->tMenuCtrlStyles.vMenuCtlBkgClr.count()>0){ QLinearGradient gradient(QPoint(0, 0), QPoint(width(), height())); ...
  • 有点颓废了,好久不写了。不写东西还是会忘。 最近项目用到了arcigs地图这一块,需要在上面做一个扇形表示区间。 不多说了先看效果图。
  • Qt 2D绘制(2):绘制椭圆、弧、弦、扇形、圆角矩形 若对C++语法不熟悉,建议参阅《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的...
  • Qt刻度尺入门

    千次阅读 多人点赞 2020-08-23 06:15:35
    Qt刻度尺入门 效果图 上源码 #include "rulerslider.h" #include "QPainter" #include "math.h" #include <QDebug> #include <QEvent> #include <QMouseEvent> RulerSlider::RulerSlider...
  • 最近项目中用到了画圆和画扇形,所以写出来 二、Polygon The first and last points of a ring must be the same 环的第一点和最后一点必须相同 A polygon contains an array of rings and a spatialReference. 边...
  • 本文配置环境:vs2015+qt5.13.1 注: 在vs中使用QtChart需要在安装时候勾选 1、选取显示窗口 首先在vs中创建一个qt程序,进入ui编辑界面,将widget添加到主界面上 然后将widget进行提升为QChartView 2、配置Qt...
  • 首先介绍一下Qt的坐标机制: Qt的坐标与我们常见的坐标不同,如图,假设下图的矩形就是我们的窗口,矩形左上角顶点即为坐标原点: 绘制矩形 核心代码: paint->drawRect(20,20,160,160); 1 第1、2个参数...
  • 本项目参考了Qt侠的广告占比图,更改了饼图颜色,重新绘制而成。原版在此 https://blog.csdn.net/feiyangqingyun/article/details/98472081
  • 青色烟雨,孤影等你归来。 Mainwindow.h中添加 #include <QPainter> void paintEvent(QPaintEvent*); 在mainwindow.cpp中添加 ... painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap));
  • Qt提供的刷风格及其效果如下图: 渐变填充   在刷中可以使用渐变填充,而QGradient类就是用来和QBrush一起指定渐变填充的。Qt支持三种类型的渐变填充:1)线性渐变:在开始点和结束点之间插入颜色;2)辐射渐变...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 504
精华内容 201
关键字:

qt画扇形