热搜:前端 nest neovim nvim

9 Qt Charts

lxf2023-06-20 03:44:59

概述

折线图 样条曲线 面积 散点 条形
饼图 方块胡须图 蜡烛图 极坐标图

9 Qt Charts

9 Qt Charts

9 Qt Charts

折线图

//QT += charts
#include    <QtCharts>  //必须这么设置
QT_CHARTS_USE_NAMESPACE//使用宏定义 或using namespace QtCharts

    //创建图表
    QChartView *chartView=new QChartView(this); //创建 ChartView
    QChart *chart = new QChart(); //创建 Chart
    chart->setTitle("简单函数曲线");

    chartView->setChart(chart); //Chart添加到ChartView
    this->setCentralWidget(chartView);

	//创建曲线序列
    QLineSeries *series0 = new QLineSeries();
    series0->setName("Sin曲线");
    chart->addSeries(series0); //序列添加到图表

	//序列添加数值
    qreal   t=0,y1,y2,intv=0.1;
    int cnt=100;
    for(int i=0;i<cnt;i++)
    {
        y1=qSin(t);//+qrand();
        series0->append(t,y1);
        t+=intv;
    }

	//创建坐标轴
    QValueAxis *axisX = new QValueAxis; //X 轴
    axisX->setRange(0, 10); //设置坐标轴范围
	axisX->setTitleText("time(secs)"); //标题
	chart->setAxisX(axisX, series0); //为序列设置坐标轴

9 Qt Charts

9 Qt Charts

//案例
ui->btnColor->setAutoFillBackground(true); //设置颜色按钮的背景色
QString str=QString::asprintf("background-color: rgb(%d, %d, %d);",                         color.red(),color.green(),color.blue());
ui->btnColor->setStyleSheet(str);

chart->addAxis(axisX,Qt::AlignBottom); //坐标轴添加到图表,并指定方向
series0->attachAxis(axisX); //序列 series0 附加坐标轴
*series0<<QPointF(t,y1);  //序列添加数据点
QMargins    mg=aChart->margins(); //边距
mgs.setLeft(ui->spinMarginLeft->value());
ui->chartView->chart()->setMargins(mgs);
//坐标轴设置
QValueAxis *axisX = new QValueAxis;
axisX->setRange(0, 10); //设置坐标轴范围
axisX->setLabelFormat("%.1f"); //标签格式
axisX->setTickCount(11); //主分隔个数(坐标要有几个数)
axisX->setMinorTickCount(4);//每个小格子中有几个刻度,次分隔个数
//序列的数据点是否可见
curSeries->setPointsVisible(checked);
//序列的数据点标签是否可见
curSeries->setPointLabelsVisible(checked);
//图例是否可见
ui->chartView->chart()->legend()->setVisible(checked);
//获取坐标轴
QAbstractAxis* axes=ui->chartView->chart()->axes(Qt::Horizontal);
//轴的网格线是否可见
curAxis->setGridLineVisible(checked);
//次级刻度是否可见
curAxis->setMinorGridLineVisible(checked);
//图例的背景是否可见
ui->chartView->chart()->legend()->setBackgroundVisible(checked);
//图例的位置
ui->chartView->chart()->legend()->setAlignment(Qt::AlignTop);
//设置坐标轴刻度标签的文字格式
curAxis->setLabelFormat(ui->editAxisLabelFormat->text());
//网格线的颜色设置
QColor   color=curAxis->gridLineColor();
curAxis->setGridLineColor(color);
//次级刻度网格线颜色
QColor   color=curAxis->minorGridLineColor();
curAxis->setMinorGridLineColor(color);
//序列的透明度
curSeries->setOpacity(value/10.0);
//序列数据点标签颜色
QColor  color=curSeries->pointLabelsColor();
curSeries->setPointLabelsColor(color);
//序列数据点标签的显示格式
curSeries->setPointLabelsFormat("@yPoint");
curSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
//动画效果
ui->chartView->chart()->setAnimationOptions(QChart::AnimationOptions(index));
//图表的主题
ui->chartView->chart()->setTheme(QChart::ChartTheme(index));
//放大
ui->chartView->chart()->zoom(1.2);//zoomIn();

其他常见图

9 Qt Charts

//创建柱状图
QChart *chart =ui->chartViewBar->chart(); //获取ChartView关联的chart
//创建三个QBarSet数据集,从数据模型的表头获取Name
    QBarSet *setMath = new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());
    QBarSet *setChinese = new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());
    QBarSet *setEnglish= new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());
QLineSeries *Line = new QLineSeries(); //创建一个QLineSeries序列用于显示平均分
//创建一个柱状图序列 QBarSeries, 并添加三个数据集
    QBarSeries *series = new QBarSeries();
    series->append(setMath);
    series->append(setChinese);
    series->append(setEnglish);

	chart->addSeries(series); //添加柱状图序列
    chart->addSeries(Line); //添加折线图序列
//用于横坐标在字符串列表,即学生姓名
    QStringList categories;
    for (int i=0;i<theModel->rowCount();i++)
        categories <<theModel->item(i,colNoName)->text();

//用于柱状图的坐标轴
    QBarCategoryAxis *axisX = new QBarCategoryAxis();
    axisX->append(categories); //添加横坐标文字列表
    chart->setAxisX(axisX, series); //设置横坐标
    chart->setAxisX(axisX, Line);//设置横坐标
    axisX->setRange(categories.at(0), categories.at(categories.count()-1)); //这只坐标轴范围

//数值型坐标作为纵轴
    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0, 100);
    axisY->setTitleText("分数");
    axisY->setTickCount(6);//11
    axisY->setLabelFormat("%.0f"); //标签格式
    chart->setAxisY(axisY, series); 
    chart->setAxisY(axisY, Line);

9 Qt Charts

//叠加柱状图
QStackedBarSeries *series = new QStackedBarSeries();
//其余和柱状图相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6mIVhUiH-1643874436171)(https://gitee.com/big-gift/my-pic/raw/master/Qt/image-20220118143511306.png)]

//绘制百分比柱状图
QPercentBarSeries *series = new QPercentBarSeries(); //序列

9 Qt Charts

//绘制饼图
    QChart *chart =ui->chartViewPie->chart(); //获取chart对象
	QPieSeries *series = new QPieSeries(); //创建饼图序列
    series->setHoleSize(ui->spinHoleSize->value()); //饼图中间空心的大小
	series->setPieSize(ui->spinPieSize->value());

QPieSlice *slice; //饼图分块
    for(int i=0;i<=4;i++) //设置每个分块的标签文字
    {
        slice =series->slices().at(i);  //获取分块
        slice->setLabel(slice->label()+QString::asprintf(": %.0f人, %.1f%%",    //设置分块的标签
                        slice->value(),slice->percentage()*100));
//信号与槽函数关联,鼠标落在某个分块上时,此分块弹出
        connect(slice, SIGNAL(hovered(bool)),
                this, SLOT(on_PieSliceHighlight(bool)));
    }
    slice->setExploded(true); //最后一个设置为exploded
    series->setLabelsVisible(true); //只影响当前的slices,必须添加完slice之后再设置
    chart->addSeries(series); //添加饼图序列
    chart->setTitle("Piechart----"+ui->cBoxCourse->currentText());

    chart->legend()->setVisible(true); //图例
    chart->legend()->setAlignment(Qt::AlignRight);//Qt::AlignRight

void MainWindow::on_PieSliceHighlight(bool show)
{ //鼠标移入、移出时触发hovered()信号,动态设置setExploded()效果
    QPieSlice *slice;
    slice=(QPieSlice *)sender();
    slice->setExploded(show);
}

chart()->setTheme(QChart::ChartTheme(index));//更改主体

9 Qt Charts

//绘制 QScatterSeries和QSplineSeries图
QSplineSeries *seriesLine = new QSplineSeries(); //光滑曲线序列
QScatterSeries *series0 = new QScatterSeries(); //散点序列
series0->setMarkerShape(QScatterSeries::MarkerShapeCircle);
 chart->addSeries(series0);
    chart->addSeries(seriesLine);
chart->createDefaultAxes(); //创建缺省的坐标轴

图表的其他操作

9 Qt Charts

//自定义的QWChartView.h
#include    <QtCharts>  //必须这么设置
QT_CHARTS_USE_NAMESPACE     //必须这么设置

class QWChartView : public QChartView
{
    Q_OBJECT

private:
    QPoint  beginPoint; //选择矩形区的起点
    QPoint  endPoint;  //选择矩形区的终点

protected:
    void mousePressEvent(QMouseEvent *event); //鼠标左键按下
    void mouseMoveEvent(QMouseEvent *event); //鼠标移动
    void mouseReleaseEvent(QMouseEvent *event); //鼠标释放左键
    void keyPressEvent(QKeyEvent *event); //按键事件

public:
    explicit QWChartView(QWidget *parent = 0);
    ~QWChartView();

signals:
    void mouseMovePoint(QPoint point); //鼠标移动信号,在mouseMoveEvent()事件中触发
};
//自定义的QWChartView.cpp
#include "qwchartview.h"
#include    <QChartView>
void QWChartView::mousePressEvent(QMouseEvent *event)
{//鼠标左键按下,记录beginPoint
    if (event->button()==Qt::LeftButton)
        beginPoint=event->pos();
    QChartView::mousePressEvent(event);
}

void QWChartView::mouseMoveEvent(QMouseEvent *event)
{//鼠标移动事件
    QPoint  point;
    point=event->pos();

    emit mouseMovePoint(point);
    QChartView::mouseMoveEvent(event);
}

void QWChartView::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button()==Qt::LeftButton)
    { //鼠标左键释放,获取矩形框的endPoint,进行缩放
        endPoint=event->pos();
        QRectF  rectF;
        rectF.setTopLeft(this->beginPoint);
        rectF.setBottomRight(this->endPoint);
        this->chart()->zoomIn(rectF);
    }
    else if (event->button()==Qt::RightButton)
        this->chart()->zoomReset(); //鼠标右键释放,resetZoom
    QChartView::mouseReleaseEvent(event);
}

void QWChartView::keyPressEvent(QKeyEvent *event)
{//按键控制
    switch (event->key()) {
    case Qt::Key_Plus:  //+
        chart()->zoom(1.2);
        break;
    case Qt::Key_Minus:
        chart()->zoom(0.8);
        break;
    case Qt::Key_Left:
        chart()->scroll(10, 0);
        break;
    case Qt::Key_Right:
        chart()->scroll(-10, 0);
        break;
    case Qt::Key_Up:
        chart()->scroll(0, -10);
        break;
    case Qt::Key_Down:
        chart()->scroll(0, 10);
        break;
    case Qt::Key_PageUp:
        chart()->scroll(0, 50);
        break;
    case Qt::Key_PageDown:
        chart()->scroll(0, -50);
        break;
    case Qt::Key_Home:
        chart()->zoomReset();
        break;
    default:
        QGraphicsView::keyPressEvent(event);
    }
}
QWChartView::QWChartView(QWidget *parent):QChartView(parent)
{
    this->setDragMode(QGraphicsView::RubberBandDrag);
    this->setMouseTracking(true);//必须开启此功能
}
void MainWindow::on_LegendMarkerClicked()
{//点击图例的marker的响应
    QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());

    switch (marker->type()) //marker的类型
    {
        case QLegendMarker::LegendMarkerTypeXY: //QLineSeries序列的图例marker
        {
            marker->series()->setVisible(!marker->series()->isVisible()); //可见性
            marker->setVisible(true);
            qreal alpha = 1.0;
            if (!marker->series()->isVisible())
                alpha = 0.5;

            QColor color;
            QBrush brush = marker->labelBrush();
            color = brush.color();
            color.setAlphaF(alpha);
            brush.setColor(color);
            marker->setLabelBrush(brush);

            brush = marker->brush();
            color = brush.color();
            color.setAlphaF(alpha);
            brush.setColor(color);
            marker->setBrush(brush);

            QPen pen = marker->pen();
            color = pen.color();
            color.setAlphaF(alpha);
            pen.setColor(color);
            marker->setPen(pen);
            break;
        }
        default:
            break;
    }
}

//鼠标移动响应
QPointF pt=ui->chartView->chart()->mapToValue(point); //转换为图表的数值
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!