QChrat系列图

作者: c之气三段 | 来源:发表于2021-09-05 17:24 被阅读0次

    折线图

    .h

    #ifndef CHARTWIDGET_H
    #define CHARTWIDGET_H
    
    #include <QWidget>
    #include <QtCharts>
    #include <QChartView>
    #include <QSplineSeries>
    namespace Ui {
    class LinesWidget;
    }
    struct Line
    {
      QString name;
      QList<QPointF> listPoints;
    };
    class LinesWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit LinesWidget(QWidget *parent = 0);
        ~LinesWidget();
        void addLine(const QList<QPointF> &listPoints,const QString &lineName);
        void setTitle(const QString &title);
        void draw();
        void clearLines();
        void test();
    private:
        Ui::LinesWidget *ui;
        QChart *m_pChart;    //创建图表对象
        QList<Line>m_listLines;
        QString m_title=QStringLiteral("我的图例");
        QList<QLineSeries*>m_lineSeriess;
        QChartView *m_pChartView;
    };
    
    #endif // CHARTWIDGET_H
    
    

    .cpp

    #include "LinesWidget.h"
    #include "ui_LinesWidget.h"
    
    LinesWidget::LinesWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::LinesWidget)
    {
        ui->setupUi(this);
        m_pChartView = new QChartView();
        m_pChart = new QChart();                          //创建图标对象
        m_pChart->setTheme(QChart::ChartThemeDark);       //设置图标主题
        m_pChartView->setChart(m_pChart);                    //向chartView中添加图表
        m_pChartView->setRenderHints(QPainter::Antialiasing);//消除边缘,看起来平滑一些
        ui->horizontalLayout->addWidget(m_pChartView);
        m_pChart->setBackgroundBrush(QColor(230,230,230));//修改背景色
    }
    
    LinesWidget::~LinesWidget()
    {
        qDeleteAll(m_lineSeriess);
        m_lineSeriess.clear();
        delete m_pChart;
        delete m_pChartView;
        delete ui;
    }
    
    void LinesWidget::addLine(const QList<QPointF> &listPoints, const QString &lineName)
    {
        Line line;
        line.name=lineName;
        line.listPoints=listPoints;
        m_listLines.append(line);
    }
    
    void LinesWidget::setTitle(const QString &title)
    {
        m_title=title;
    }
    
    void LinesWidget::draw()
    {
        m_pChart->setTitle(m_title);     //设置图标名称
        QLineSeries *pLineSeries =nullptr;        //创建折线系列
        for(int i=0;i<m_listLines.size();i++)
        {
            pLineSeries=new QLineSeries;
            m_lineSeriess.append(pLineSeries);
            for(int j=0;j<m_listLines.at(i).listPoints.size();j++)
            {
                pLineSeries->append(m_listLines.at(i).listPoints.at(j));
            }
            pLineSeries->setPointLabelsColor(QColor(70,70,70));
            pLineSeries->setName(m_listLines.at(i).name);
            m_pChart->addSeries(pLineSeries);
            //移动到线上输出坐标
            connect(pLineSeries,&QLineSeries::hovered,[=](QPointF point,bool state){
                if(state)
                {
                   QString strXY;
                   strXY=QString("%1").arg(point.x());
                   strXY+=",";
                   strXY+=QString("%1").arg(point.y());
                   QToolTip::showText(QCursor::pos(),strXY);
                }
            });
        }
        m_pChart->createDefaultAxes();//创建默认的坐标,必须在addSeries之后调用
        m_pChart->setTitleBrush(QColor(70,70,70));  //设置标题颜色
        m_pChart->legend()->setLabelColor(QColor(70,70,70));//设置图例字体颜色
        m_pChart->axisX()->setLabelsColor(QColor(70,70,70));//设置x轴的标签颜色,就是显示的文字颜色
        m_pChart->axisY()->setLabelsColor(QColor(70,70,70));
    }
    
    void LinesWidget::clearLines()
    {
        m_listLines.clear();
        qDeleteAll(m_lineSeriess);
        m_lineSeriess.clear();
    }
    
    void LinesWidget::test()
    {
        setTitle("examp");
        QList<QPointF> listPoints;
        for(quint8 i=10; i<20; i++)
        {
           listPoints.append(QPointF(i,qrand()%300));
        }
        addLine(listPoints,"numberone");
        draw();
    }
    

    柱状图

    .h

    #ifndef HISTGRAMWIDGET_H
    #define HISTGRAMWIDGET_H
    
    #include <QWidget>
    #include <QChartView>
    #include <QtCharts>
    struct Pillars 
    {
        QString name;
        QList<float>data;
    };
    namespace Ui {
    class HistgramWidget;
    }
    class HistgramWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit HistgramWidget(QWidget *parent = 0);
        ~HistgramWidget();
         void addPillars(const QList<float> &pillarsData,const QString &name);
         void setTitle(const QString &title);
         void draw();
         void setAxisText(const QStringList &listAxisText);
         void clearPillars();
         void test();
    private:
        Ui::HistgramWidget *ui;
        QChartView *m_pChartView;
        QChart *m_pChart;
        QBarSeries *m_pBarSeries = nullptr;
        QList<QBarSet*> m_barSets;
        QList<Pillars>m_kindsPillars;
        QString m_title = "Histgram";
        QBarCategoryAxis *m_pAxis = nullptr;
    };
    
    #endif // HISTGRAMWIDGET_H
    
    

    .cpp

    #include "HistgramWidget.h"
    #include "ui_HistgramWidget.h"
    
    HistgramWidget::HistgramWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::HistgramWidget)
    {
        ui->setupUi(this);
        m_pChartView = new QChartView;
        m_pChart = new QChart;
        m_pChart->setTheme(QChart::ChartThemeDark);
        m_pChartView->setChart(m_pChart);
        m_pChartView->setRenderHints(QPainter::Antialiasing);
        ui->verticalLayout->addWidget(m_pChartView);
        m_pChart->setBackgroundBrush(QColor(230,230,230));
        m_pAxis = new QBarCategoryAxis;//横坐标显示
        //m_pChart->legend()->setAlignment(Qt::AlignBottom);//设置图例的显示位置在底部
    }
    
    HistgramWidget::~HistgramWidget()
    {
        if(m_barSets.size()!=0)
        {
            qDeleteAll(m_barSets);
            m_barSets.clear();
            delete m_pBarSeries;
        }
        delete m_pAxis;
        delete ui;
    }
    
    void HistgramWidget::addPillars(const QList<float> &pillarsData, const QString &name)
    {
        Pillars pillars;
        pillars.data = pillarsData;
        pillars.name = name;
        m_kindsPillars.append(pillars);
    }
    
    void HistgramWidget::setTitle(const QString &title)
    {
        m_title = title;
    }
    
    void HistgramWidget::draw()
    {
        m_pChart->setTitle(m_title);
        m_pBarSeries = new QBarSeries;
        QBarSet *pBarSet = nullptr;
        for(int i=0;i<m_kindsPillars.size();i++)
        {
            pBarSet=new QBarSet(m_kindsPillars.at(i).name);
            for(int j=0;j<m_kindsPillars.at(i).data.size();j++)
            {
                *pBarSet<<m_kindsPillars.at(i).data.at(j);
            }
            m_barSets.append(pBarSet);
            m_pBarSeries->append(pBarSet);
        }
        connect(m_pBarSeries,&QBarSeries::hovered,[=](bool state,int index,QBarSet *pCurrBarSet){
            if(state)
            {
                QString text;
                text=pCurrBarSet->label();
                text+=":";
                text+=QString("%1").arg(pCurrBarSet->at(index));
                text+=",";
                text+= m_pAxis->at(index);
                QToolTip::showText(QCursor::pos(),text);
            }
        });
        m_pChart->addSeries(m_pBarSeries);
        m_pChart->createDefaultAxes();
        m_pChart->setAxisX(m_pAxis);
        m_pChart->setTitleBrush(QColor(70,70,70));  //设置标题颜色
        m_pChart->legend()->setLabelColor(QColor(70,70,70));//设置图例字体颜色
        m_pChart->axisX()->setLabelsColor(QColor(70,70,70));//设置x轴的标签颜色,就是显示的文字颜色
        m_pChart->axisY()->setLabelsColor(QColor(70,70,70));
    }
    
    void HistgramWidget::setAxisText(const QStringList &listAxisText)
    {
        m_pAxis->clear();
        m_pAxis->append(listAxisText);
    }
    
    void HistgramWidget::clearPillars()
    {
        if(m_barSets.size()==0)return;
        m_kindsPillars.clear();
        qDeleteAll(m_barSets);
        m_barSets.clear();
        delete m_pBarSeries;
        m_pBarSeries=nullptr;
    }
    
    void HistgramWidget::test()
    {
        QList<float> data;
        for(int i=0;i<5;i++)
        {
            data<<i*2+1;
        }
        addPillars(data,"one");
        QList<float> data1;
        for(int i=0;i<5;i++)
        {
            data1<<i+1;
        }
        addPillars(data1,"tow");
        QStringList list;
        list<<"a";
        list<<"b";
        list<<"c";
        list<<"d";
        list<<"e";
        setAxisText(list);
        draw();
    }
    
    

    面积图

    .h

    #ifndef AREAWIDGET_H
    #define AREAWIDGET_H
    
    #include <QWidget>
    #include <QtCharts>
    #include <QChartView>
    struct AreaLine
    {
      QString name;
      QList<QPointF> listPoints;
    };
    namespace Ui {
    class AreaWidget;
    }
    class AreaWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit AreaWidget(QWidget *parent = 0);
        ~AreaWidget();
        void addLine(const QList<QPointF> &listPoints,const QString &lineName);
        void setTitle(const QString &title);
        void draw();
        void clearArea();
        void test();
    private:
        Ui::AreaWidget *ui;
        QChart *m_pChart;
        QChartView *m_pChartView;
        QList<AreaLine>m_listLines;
        QString m_title="areaChart";
        QList<QLineSeries*>m_listLineSeriess;
        QList<QAreaSeries*>m_listAreaSeriess;
    };
    
    #endif // AREAWIDGET_H
    
    

    .cpp

    #include "AreaWidget.h"
    #include "ui_AreaWidget.h"
    
    AreaWidget::AreaWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::AreaWidget)
    {
        ui->setupUi(this);
        m_pChartView = new QChartView;
        m_pChart = new QChart;
        m_pChart->setTheme(QChart::ChartThemeDark);
        m_pChartView->setChart(m_pChart);
        m_pChartView->setRenderHints(QPainter::Antialiasing);
        m_pChart->setBackgroundBrush(QColor(230,230,230));
        m_pChartView->setChart(m_pChart);
        ui->verticalLayout->addWidget(m_pChartView);
    }
    
    AreaWidget::~AreaWidget()
    {
        qDeleteAll(m_listLineSeriess);
        m_listLineSeriess.clear();
        qDeleteAll(m_listAreaSeriess);
        m_listAreaSeriess.clear();
        delete m_pChartView;
        delete ui;
    }
    
    void AreaWidget::addLine(const QList<QPointF> &listPoints,const QString &lineName)
    {
        AreaLine line;
        line.name=lineName;
        line.listPoints=listPoints;
        m_listLines.append(line);
    }
    
    void AreaWidget::setTitle(const QString &title)
    {
        m_title = title;
    }
    
    void AreaWidget::draw()
    {
        m_pChart->setTitle(m_title);
        QLineSeries *pLineSeries=nullptr;
        QAreaSeries *pAreaSeries=nullptr;
        QLineSeries *pTempLineSeries=nullptr;
        for(int i=0;i<m_listLines.size();i++)
        {
            pLineSeries=new QLineSeries;
            //pLineSeries->setName(m_listLines.at(i).name);
            for(int j=0;j<m_listLines.at(i).listPoints.size();j++)
            {
                pLineSeries->append(m_listLines.at(i).listPoints.at(j));
            }
            m_listLineSeriess.append(pLineSeries);
            pAreaSeries=new QAreaSeries;
            pAreaSeries->setName(m_listLines.at(i).name);
            pAreaSeries->setUpperSeries(pLineSeries);
            pAreaSeries->setLowerSeries(pTempLineSeries);
            pTempLineSeries=pLineSeries;
            m_listAreaSeriess.append(pAreaSeries);
            m_pChart->addSeries(pAreaSeries);
            connect(pAreaSeries,&QAreaSeries::hovered,[=](const QPointF &pointf,bool state){
                if(state)
                {
                   QString strXY;
                   strXY=QString("%1").arg(pointf.x());
                   strXY+=",";
                   strXY+=QString("%1").arg(pointf.y());
                   QToolTip::showText(QCursor::pos(),strXY);
                }
            });
        }
        m_pChart->createDefaultAxes();
        m_pChart->setTitleBrush(QColor(70,70,70)); 
        m_pChart->legend()->setLabelColor(QColor(70,70,70));
        m_pChart->axisX()->setLabelsColor(QColor(70,70,70));
        m_pChart->axisY()->setLabelsColor(QColor(70,70,70));
    }
    
    void AreaWidget::clearArea()
    {
       m_listLines.clear();
       qDeleteAll(m_listLineSeriess);
       m_listLineSeriess.clear();
       qDeleteAll(m_listAreaSeriess);
       m_listAreaSeriess.clear();
    }
    
    void AreaWidget::test()
    {
        QList<QPointF> listPoints;
        for(quint8 i=10; i<20; i++)
        {
           listPoints.append(QPointF(i,qrand()%300));
        }
        addLine(listPoints,"numberone");
        QList<QPointF> listPoints1;
        for(quint8 i=15; i<20; i++)
        {
           listPoints1.append(QPointF(i,qrand()%300));
        }
        addLine(listPoints1,"numbertow");
        draw();
    }
    
    

    自定义极坐标

    item.h

    #ifndef SHAPEITEM_H
    #define SHAPEITEM_H
    
    #include <QGraphicsItem>
    #include <QPen>
    
    class ArcShapeItem : public QGraphicsItem
    {
    public:
        explicit ArcShapeItem(QGraphicsItem  *parent = nullptr);
        ~ArcShapeItem();
        void setShapeItem(int x,int y,int width,int angle);
        void setPen(const QPen &pen);
    public:
        //绘图区域
        virtual QRectF boundingRect() const override;
        //绘图函数
        virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
    private:
        int m_x,m_y,m_width;
        int m_angle;
        QPen m_pen;
    };
    
    #endif // SHAPEITEM_H
    
    

    item.cpp

    #include "ArcShapeItem.h"
    
    #include <QPainter>
    #include<QDebug>
    ArcShapeItem::ArcShapeItem(QGraphicsItem  *parent) : QGraphicsItem(parent)
    {
    
    }
    
    ArcShapeItem::~ArcShapeItem()
    {
    
    }
    
    void ArcShapeItem::setShapeItem(int x, int y, int width,int angle)
    {
        m_x=x;
        m_y=y;
        m_width=width;
        m_angle=angle;
    }
    
    void ArcShapeItem::setPen(const QPen& pen)
    {
        m_pen=pen;
    }
    
    QRectF ArcShapeItem::boundingRect() const
    {
        return QRectF(m_x, m_y,m_width, m_width);
    }
    
    void ArcShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
    {
        Q_UNUSED(option)
        Q_UNUSED(widget)
        // 矩形
        QRectF rect(m_x, m_y, m_width, m_width);
        // 起始角度
        int startAngle = 0;
        // 跨越度数
        double spanAngle = m_angle * 16;
    
        // 反走样
        painter->setRenderHint(QPainter::Antialiasing, true);
    
        // 设置画笔颜色、宽度
        painter->setPen(m_pen);
    
        // 绘制弧线
        painter->drawPie(rect, startAngle, spanAngle);
    }
    
    

    图表.h

    #ifndef POLARWIDGET_H
    #define POLARWIDGET_H
    
    #include <QWidget>
    #include <QGraphicsView>
    #include "ArcShapeItem.h"
    class LineItem:public QGraphicsLineItem
    {
    public:
        LineItem();
    
        // QGraphicsItem interface
        void setRatio(float ratio);
    
    protected:
        virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
    private:
        float m_ratio;
    };
    namespace Ui {
    class PolarWidget;
    }
    struct Data
    {
       QString legend;
       QList<QPointF> points;
    };
    class PolarWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit PolarWidget(QWidget *parent = 0);
        ~PolarWidget();
        void addLine(const QString &legend,const QList<QPointF> &points);
        void setTitle(const QString &title);
        void draw();
        void clearLines();
        void test();
    private:
        void setAcrossAngle(float angle);
        void axisX();
        void setAxisXTickCount(int count);
        void setXRange(float start,float end);
        void axisY();
        void setAxisYTickCount(int count);
        void createColor();
        void rePaintAll();
    private:
        Ui::PolarWidget *ui;
        QGraphicsView *m_pGraphicView;
        QGraphicsScene *m_pScene;
        QPen m_pen;
        QList<ArcShapeItem*>m_listShaps;
        int m_halfWidth,m_halfHeight;
        int m_axisXTickCount,m_axisYTickCount;
        float m_angle;
        float m_xStart,m_xEnd;
        float m_r;
        QList<Data>m_listLines;
        QString m_title="polarPicture";
        QList<LineItem*>m_lines;
        QList<QColor>m_listColor;
        QList<QGraphicsItem*> m_items;
        QGraphicsItemGroup *m_pTtemGroup=nullptr;
        // QWidget interface
    protected:
        virtual void resizeEvent(QResizeEvent *event) override;
    };
    #endif // POLARWIDGET_H
    
    

    .cpp

    #include "PolarWidget.h"
    #include "ui_PolarWidget.h"
    #include<QDebug>
    #include <QGraphicsSceneHoverEvent>
    #include <QResizeEvent>
    #include<QToolTip>
    PolarWidget::PolarWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::PolarWidget)
    {
        ui->setupUi(this);
        //构建画布
        m_pGraphicView=new QGraphicsView;
        m_pGraphicView->setRenderHint(QPainter::Antialiasing, true);
        m_pGraphicView->setStyleSheet("background-color:rgb(230, 230, 230)");
        m_pGraphicView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        m_pGraphicView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        ui->verticalLayout->addWidget(m_pGraphicView);
        //构建场景,QGraphicsView中心点为(0,0)
        m_pScene = new QGraphicsScene();
        m_pGraphicView->setScene(m_pScene);
        m_halfWidth=m_pGraphicView->width()/2;
        m_halfHeight=m_pGraphicView->height()/2;
        m_pScene->setSceneRect(-m_halfWidth, -m_halfHeight, width(),height());
        m_pGraphicView->setScene(m_pScene);
        //画笔
        m_pen.setWidth(1);
        m_pen.setColor(QColor(30, 30, 30));
        createColor();
        axisX();
        axisY();
    }
    
    PolarWidget::~PolarWidget()
    {
        qDeleteAll(m_listShaps);
        m_listShaps.clear();
        qDeleteAll(m_lines);
        m_lines.clear();
        qDeleteAll(m_items);
        m_items.clear();
        if(m_pTtemGroup!=nullptr)
        {
           delete m_pTtemGroup;
        }
        delete m_pScene;
        delete m_pGraphicView;
        delete ui;
    }
    
    void PolarWidget::addLine(const QString &legend, const QList<QPointF> &points)
    {
        Data data;
        data.legend=legend;
        data.points=points;
        m_listLines.append(data);
    }
    
    void PolarWidget::setTitle(const QString &title)
    {
        m_title = title;
    }
    
    void PolarWidget::draw()
    {
        m_pTtemGroup = new QGraphicsItemGroup;
        QGraphicsSimpleTextItem *pTextItem=m_pScene->addSimpleText(m_title,QFont(QStringLiteral("楷体"),10));
        pTextItem->setPen(m_pen);
        int width=pTextItem->boundingRect().width();
        int height=pTextItem->boundingRect().height();
        pTextItem->setPos(-width/2,-m_r-50-height/2);
        LineItem* pLine=nullptr;
        QPen pen;
        pen.setWidth(2);
        if(m_listLines.size()>16)
        {
            return;
        }
        int posLoca=0;
        for(int i=0;i<m_listLines.size();i++)
        {
            float x1=0.0f,y1=0.0f;
            float detax=m_xEnd-m_xStart;
            float ratio=m_r/detax;
            pen.setColor(m_listColor.at(i));
            for(int j=0;j<m_listLines.at(i).points.size();j++)
            {
                float x2=(float)abs(m_listLines.at(i).points.at(j).x())*ratio*cosf(-m_listLines.at(i).points.at(j).y()*3.1415926/180);
                float y2=(float)abs(m_listLines.at(i).points.at(j).x())*ratio*sinf(-m_listLines.at(i).points.at(j).y()*3.1415926/180);
                pLine=new LineItem;
                pLine->setLine(QLineF(x1,y1,x2,y2));
                pLine->setRatio(ratio);
                m_pScene->addItem(pLine);
                pLine->setPen(pen);
                m_lines.append(pLine);
                x1=x2;
                y1=y2;
            }
            QGraphicsRectItem *pRectItem = new QGraphicsRectItem;
            pRectItem->setRect(posLoca,-4,10,10);
            pRectItem->setBrush(QBrush(m_listColor.at(i)));
            pRectItem->setPen(pen);
    
            QGraphicsSimpleTextItem *pTextItem=new QGraphicsSimpleTextItem;
            pTextItem->setText(m_listLines.at(i).legend);
            pTextItem->setFont(QFont(QStringLiteral("楷体"),10));
            pTextItem->setPen(m_pen);
            int widthText=pTextItem->boundingRect().width();
            int heightText=pTextItem->boundingRect().height();
            pTextItem->setPos(posLoca+10+2,-heightText/2);
    
            m_items.append(pRectItem);
            m_items.append(pTextItem);
            m_pTtemGroup->addToGroup(pRectItem);
            m_pTtemGroup->addToGroup(pTextItem);
            posLoca=posLoca+widthText+10+2+10;
        }
        int widthGrop=m_pTtemGroup->boundingRect().width();
        int heightGrop=m_pTtemGroup->boundingRect().height();
        m_pTtemGroup->setPos(-widthGrop/2,m_r+50-heightGrop/2);
        m_pScene->addItem(m_pTtemGroup);
    }
    
    void PolarWidget::clearLines()
    {
        m_listLines.clear();
        rePaintAll();
    }
    
    void PolarWidget::axisY()
    {
        setAxisYTickCount(13);
        float interval=m_angle/(m_axisYTickCount-1);
        float currAngle=0.0f;
        for(int i=0;i<m_axisYTickCount;i++)
        {
            float x=(float)m_r*cosf(currAngle*3.1415926/180);
            float y=(float)m_r*sinf(currAngle*3.1415926/180);
            QGraphicsLineItem *lineItem = m_pScene->addLine(QLineF(0,0,x ,y));
            lineItem->setPen(m_pen);
            QString strText=QString("%1").arg(currAngle);
            if(i==m_axisYTickCount-1)return;
            QGraphicsSimpleTextItem *pTextItem=m_pScene->addSimpleText(strText,QFont(QStringLiteral("楷体"),10));
            pTextItem->setPen(m_pen);
            float x1=(float)(m_r+20)*cosf(-currAngle*3.1415926/180);
            float y1=(float)(m_r+20)*sinf(-currAngle*3.1415926/180);
            int width=pTextItem->boundingRect().width();
            int height=pTextItem->boundingRect().height();
            pTextItem->setPos(x1-width/2,y1-height/2);
            currAngle+=interval;
        }
    }
    
    void PolarWidget::setAxisXTickCount(int count)
    {
        m_axisXTickCount=count;
    }
    
    void PolarWidget::axisX()
    {
        setAcrossAngle(360);
        setXRange(0.0f, 60.0f);
        setAxisXTickCount(7);
        float temp=(m_xEnd-m_xStart)/(m_axisXTickCount-1);
        float currX=m_xEnd;
        float rectWidth=m_pGraphicView->height()-150;
        m_r=rectWidth/2;
        float interval=(float)rectWidth/(m_axisXTickCount-1);
        ArcShapeItem*pArcAxis=nullptr;
        QGraphicsSimpleTextItem *pTextItem=nullptr;
        for(int i=0;i<m_axisXTickCount;i++)
        {
            pArcAxis=new ArcShapeItem;
            pArcAxis->setShapeItem(-rectWidth/2,-rectWidth/2,rectWidth,m_angle);
            m_pScene->addItem(pArcAxis);
            m_listShaps.append(pArcAxis);
            QString strText;
            if(i==0)
            {
                currX=m_xEnd;
                strText=QString("%1").arg(m_xEnd);
            }
            else if(i==m_axisXTickCount-1)
            {
                currX=m_xStart;
                strText=QString("%1").arg(m_xStart);
            }
            else
            {   currX-=temp;
                strText=QString("%1").arg(currX);
            }
            pTextItem=m_pScene->addSimpleText(strText,QFont(QStringLiteral("楷体"),10));
            pTextItem->setPen(m_pen);
            pTextItem->setPos(rectWidth/2,5);
            rectWidth -= interval;
        }
    }
    
    void PolarWidget::setAxisYTickCount(int count)
    {
        m_axisYTickCount=count;
    }
    
    void PolarWidget::createColor()
    {
        m_listColor.append(QColor(128,64,64));
        m_listColor.append(QColor(255,128,64));
        m_listColor.append(QColor(0,255,0));
        m_listColor.append(QColor(255,128,64));
        m_listColor.append(QColor(0,128,128));
        m_listColor.append(QColor(0,64,128));
        m_listColor.append(QColor(128,128,255));
        m_listColor.append(QColor(128,0,64));
        m_listColor.append(QColor(255,0,128));
        m_listColor.append(QColor(255,0,0));
        m_listColor.append(QColor(0,255,255));
        m_listColor.append(QColor(255,0,255));
        m_listColor.append(QColor(128,0,255));
        m_listColor.append(QColor(255,255,0));
        m_listColor.append(QColor(0,128,0));
        m_listColor.append(QColor(255,128,192));
    }
    
    void PolarWidget::rePaintAll()
    {
        if(m_listShaps.size()>0)
        {
            qDeleteAll(m_listShaps);
            m_listShaps.clear();
        }
        if(m_lines.size()>0)
        {
           qDeleteAll(m_lines);
           m_lines.clear();
        }
        if(m_items.size()>0)
        {
           qDeleteAll(m_items);
           m_items.clear();
        }
        if(m_pTtemGroup!=nullptr)
        {
           delete m_pTtemGroup;
           m_pTtemGroup=nullptr;
        }
        m_pScene->clear();
        axisX();
        axisY();
        draw();
    }
    
    void PolarWidget::setXRange(float start, float end)
    {
        m_xStart=start;
        m_xEnd=end;
    }
    
    void PolarWidget::resizeEvent(QResizeEvent *event)
    {
        m_halfWidth=m_pGraphicView->width()/2;
        m_halfHeight=m_pGraphicView->height()/2;
        m_pScene->setSceneRect(-m_halfWidth, -m_halfHeight, width(),height());
        rePaintAll();
        event->ignore();
    }
    
    void PolarWidget::setAcrossAngle(float angle)
    {
        m_angle=angle;
    }
    
    LineItem::LineItem()
    {
      setAcceptHoverEvents(true);
    }
    
    void LineItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
    {
        float r=sqrtf((powf(abs(event->pos().x()),2.0f)+powf(abs(event->pos().y()),2.0f)));
        float angle;
        angle=atan2(-event->pos().y(),event->pos().x());
        angle=angle*(180/3.14159);
        QString tipText=QString("%1").arg(r/m_ratio);
        tipText+=",";
        tipText+=QString("%1").arg(angle);
        QToolTip::showText(QCursor::pos(),tipText);
    }
    
    void LineItem::setRatio(float ratio)
    {
        m_ratio = ratio;
    }
    
    void PolarWidget::test()
    {
       QList<QPointF>points;
       for(int i=0;i<10;i++)
       {
           QPointF point;
           point.setX(i*5);
           point.setY(i*10+5);
           points.append(point);
       }
       addLine("one",points);
       QList<QPointF>points1;
       for(int i=0;i<10;i++)
       {
           QPointF point;
           point.setX(i*8);
           point.setY(i*10+8);
           points1.append(point);
       }
       addLine("tow",points1);
       QList<QPointF>points2;
       for(int i=0;i<10;i++)
       {
           QPointF point;
           point.setX(i*4);
           point.setY(i*12+4);
           points2.append(point);
       }
       addLine("tree",points2);
       draw();
    }
    
    

    相关文章

      网友评论

        本文标题:QChrat系列图

        本文链接:https://www.haomeiwen.com/subject/aggjwltx.html