QT编写BarChart直方图

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

代码分段分析

//使用QBarSet创建五个人物对象,并设置每个人每个月掉头发的数量

    //本示例要展示五个人在每个月的某项数据,比如每个月掉多少头发
    //创建要展示的对象,本示例中是姓名,并设置不同对象在每个月的数据
    QBarSet *set0 = new QBarSet("Jane");
    QBarSet *set1 = new QBarSet("John");
    QBarSet *set2 = new QBarSet("Axel");
    QBarSet *set3 = new QBarSet("Mary");
    QBarSet *set4 = new QBarSet("Sama");
    *set0<<1<<2<<3<<4<<5<<6;
    *set1<<3<<7<<6<<5<<5<<2;
    *set2<<2<<8<<1<<3<<6<<5;
    *set3<<1<<3<<5<<7<<1<<6;
    *set4<<4<<3<<3<<6<<7<<2;

//创建一个序列对象,并将上面的数据添加到序列中

    QBarSeries *series = new QBarSeries();
    series->append(set0);
    series->append(set1);
    series->append(set2);
    series->append(set3);
    series->append(set4);

//创建一个QChart类的对象chart,并将series对象加入到chart中,并设置标题和动画

    QChart *chart = new QChart();
    chart->addSeries(series);

    chart->setTitle("simple barchart example");//标题
    chart->setAnimationOptions(QChart::SeriesAnimations);//动画

创建坐标

    //首先创建一个字符串列表,作为横坐标
    QStringList *categories = new QStringList();
    *categories<<"Jane"<<"Feb"<<"Mar"<<"Apr"<<"May"<<"Jun";
    //创建一个类别轴对象
    QBarCategoryAxis *axis = new QBarCategoryAxis();
    axis->append(*categories);//添加横坐标,月份
    chart->createDefaultAxes();//设置默认坐标轴,虽然后面的设置会覆盖默认坐标轴,但是也要在后面设置之前进行初始设置
    chart->setAxisX(axis,series);//将类别轴对象(横坐标月)和序列对象(每个月的数据)作为参数,设置X轴。

//设置图例

    chart->legend()->setVisible(true);//图例可见
    chart->legend()->setAlignment(Qt::AlignBottom);//将图例放在表底

//将图表放到view中,并显示

    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);//抗锯齿
    this->setCentralWidget(chartView);

整体代码

#include <QChart>
#include <QLineSeries>
#include <QChartView>
#include <QValueAxis>
#include <QBarSet>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include "mainwindow.h"
#include "ui_mainwindow.h"


//此句必备
QT_CHARTS_USE_NAMESPACE

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //Creating Bar Charts
    //本示例要展示五个人在每个月的某项数据,比如每个月掉多少头发
    //创建要展示的对象,本示例中是姓名,并设置不同对象在每个月的数据
    QBarSet *set0 = new QBarSet("Jane");
    QBarSet *set1 = new QBarSet("John");
    QBarSet *set2 = new QBarSet("Axel");
    QBarSet *set3 = new QBarSet("Mary");
    QBarSet *set4 = new QBarSet("Sama");
    *set0<<1<<2<<3<<4<<5<<6;
    *set1<<3<<7<<6<<5<<5<<2;
    *set2<<2<<8<<1<<3<<6<<5;
    *set3<<1<<3<<5<<7<<1<<6;
    *set4<<4<<3<<3<<6<<7<<2;
    //创建一个序列对象,并将上面的数据添加到序列中
    QBarSeries *series = new QBarSeries();
    series->append(set0);
    series->append(set1);
    series->append(set2);
    series->append(set3);
    series->append(set4);
    //创建一个QChart类的对象chart,并将series对象加入到chart中
    QChart *chart = new QChart();
    chart->addSeries(series);
    //设置标题和动画
    chart->setTitle("simple chart example");
    chart->setAnimationOptions(QChart::SeriesAnimations);//设置动画

    //创建坐标
    //首先创建一个字符串列表,作为横坐标
    QStringList *categories = new QStringList();
    *categories<<"Jane"<<"Feb"<<"Mar"<<"Apr"<<"May"<<"Jun";
    //创建一个类别轴对象
    QBarCategoryAxis *axis = new QBarCategoryAxis();
    axis->append(*categories);//添加横坐标,月份
    chart->createDefaultAxes();//设置默认坐标轴,虽然后面的设置会覆盖默认坐标轴,但是也要在后面设置之前进行初始设置
    chart->setAxisX(axis,series);//将类别轴对象(横坐标月)和序列对象(每个月的数据)作为参数,设置X轴。

    //设置图例
    chart->legend()->setVisible(true);//图例可见
    chart->legend()->setAlignment(Qt::AlignBottom);//将图例放在表底

    //将图标放到view中
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);//抗锯齿
    this->setCentralWidget(chartView);
}

MainWindow::~MainWindow()
{
    delete ui;
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt 中使用 QPainter 绘制直方图可以通过以下步骤实现: 1. 创建一个 QWidget 子类的窗口部件。 2. 在窗口部件中重写 paintEvent(QPaintEvent *event) 函数,在该函数中使用 QPainter 绘制直方图。 3. 使用 QPen 和 QBrush 设置绘制直方图所需要的线条和填充颜色。 4. 使用 drawRect() 函数绘制每个直方条。 5. 使用 drawText() 函数设置坐标轴上的文字。 下面是一个简单的代码示例: ```cpp #include <QtWidgets> class HistogramWidget : public QWidget { public: HistogramWidget(QWidget *parent = nullptr) : QWidget(parent) {} protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); // 设置画笔和画刷 QPen pen(Qt::black, 1); painter.setPen(pen); QBrush brush(Qt::blue); painter.setBrush(brush); // 绘制直方图 int values[] = {10, 20, 30, 40, 50}; int maxValue = 50; QRect rect(50, 50, 200, 150); painter.drawRect(rect); int barWidth = rect.width() / 5; for (int i = 0; i < 5; i++) { int barHeight = rect.height() * values[i] / maxValue; QRect bar(rect.left() + i * barWidth, rect.bottom() - barHeight, barWidth, barHeight); painter.drawRect(bar); } // 绘制坐标轴文字 painter.drawText(rect.left() - 30, rect.top() - 10, "0"); painter.drawText(rect.right() + 10, rect.bottom(), QString::number(maxValue)); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); HistogramWidget widget; widget.resize(300, 250); widget.show(); return app.exec(); } ``` 运行上述代码,将会显示一个简单的直方图窗口。你可以根据自己的需求进行更改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值