【Qt - 柱状图 - 动态添加统计条目】

Qt - 柱状图

根据公司项目雷达信号识别项目需求统计识别结果绘制柱状图,条目数量是未知的,根据识别算法结果动态新增,开发环境是QT 5


提示:如果您需要源代码demo及相关资源,请在评论区留言,我打包发给你,开源互助,有帮助的话 就求个赞~~


前言

没有前言直接进入正题,需要说明的是我的开发环境是Qt 5


一、说明

该demo的我的主要思路是,利用QChart来绘图,利用QBarSet来绘制柱状图,利用QList来记录信息,
详细代码如下:

二、源码

1.mybarform.h

代码如下(示例):

#ifndef MYBARFORM_H
#define MYBARFORM_H

#include <QWidget>
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QValueAxis>
#include <QtCharts/QHorizontalBarSeries>
#include <QList>
#include <QPair>

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class MyBarForm;
}

class MyBarForm : public QWidget
{
    Q_OBJECT
public:
    explicit MyBarForm(QWidget *parent = 0);
    ~MyBarForm();
    void addData(QString const& label, int count); //label是柱状图条目下标,count是条目数值
private:
    bool isInPairList(QString const& label, int &index); //柱状图该条目是否已经存在了?

private:
    Ui::MyBarForm *ui;

    QChart *chart;
    QBarSet* m_set;
    QList<QPair<QString, int> > m_pairLst;  //key是柱状图条目下标,int是柱状图数值
};
#endif // MYBARFORM_H

2.mybarform.cpp

代码如下(示例):

#include "mybarform.h"
#include "ui_mybarform.h"
#include <QGridLayout>

MyBarForm::MyBarForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyBarForm)
{
    ui->setupUi(this);

    m_pairLst.clear();
    m_set = new QBarSet("");
    
    QBarSeries *series = new QBarSeries();
    series->append(m_set);
    series->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd);
    series->setLabelsVisible(true);

    chart = new QChart();
    chart->addSeries(series);
    chart->setTitle("Simple horizontal barchart example");
    chart->setAnimationOptions(QChart::SeriesAnimations);

    QBarCategoryAxis *axisX = new QBarCategoryAxis();
    chart->setAxisX(axisX, series);

    QValueAxis *axisY = new QValueAxis();
    chart->setAxisY(axisY, series);
    axisY->setRange(0, 1000);  //纵坐标Y轴范围
//![4]

//![5]
    chart->legend()->setVisible(false);
    chart->legend()->setAlignment(Qt::AlignBottom);
//![5]

//![6]
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    QGridLayout *layout = new QGridLayout(this);
    layout->addWidget(chartView);
    setLayout(layout);
}

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

static int maxY;  //需要实时刷新Y轴范围,用个全局变量来存储当前Y轴范围的最大值
void MyBarForm::addData(const QString &label, int count)
{
    int index;
    if (isInPairList(label, index))
    {//若该条目已经存在,只需要刷新数值即可
        m_set->replace(index, count);
    }
    else
    {//若该条目不存在,则需要新建条目,并对该条目进行赋值
        QPair<QString, int> pair = qMakePair(label, count);
        m_pairLst.push_back(pair);

        QBarCategoryAxis *axisX  = (QBarCategoryAxis *)chart->axisX();
        axisX->append(label);
        *m_set << count;
    }

    QValueAxis *axisY = (QValueAxis*)chart->axisY();
    axisY->applyNiceNumbers();
    if (maxY < count){//根据数据大小实时刷新Y轴显示范围,是的数据显示的更加清晰
        maxY = count + 10;
        axisY->setRange(0, maxY);
    }
}

bool MyBarForm::isInPairList(const QString &label, int &index)
{//该条目已经存在了吗?
    bool flag;
    
    flag = false;
    for (int i = 0; i < m_pairLst.size(); i++)
    {
        if (m_pairLst.at(i).first == label)
        {
            flag = true;
            index = i;
            break;
        }
    }

    return flag;
}

3.mainwindow.h

代码如下(示例):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mybarform.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void timeoutslot();  //起一个定时器,从而能动态插入数据

private:
    Ui::MainWindow *ui;
    MyBarForm *wdg;
};

#endif // MAINWINDOW_H

4.mainwindow.cpp

代码如下(示例):

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    wdg = new MyBarForm;
    setCentralWidget(wdg);

    QTimer *timer = new QTimer;
    connect(timer, &QTimer::timeout, this, &MainWindow::timeoutslot);
    timer->start(1000);
}

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

static int count;
void MainWindow::timeoutslot()
{
    count++;

    if (count < 10)
        wdg->addData("1000MHz", count);
    else if (count < 20)
        wdg->addData("2000MHz", count-10);
    else
    	wdg->addData("3000MHz", count-20);
}

效果展示

在这里插入图片描述
在这里插入图片描述

总结

`如果需要这段小功能代码源码可以给我留言。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
您好!对于在 Qt 中使用 CustomPlot 绘制柱,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了 CustomPlot 组件。您可以从官方网站下载 CustomPlot 的压缩包,并将其解压到您的项目目录中。 2. 在您的项目中包含 CustomPlot 的头文件,并在需要使用柱的地方创建一个 CustomPlot 对象: ``` #include "customplot.h" // ... QCustomPlot *plot = new QCustomPlot(this); ``` 3. 创建一个 QCPBars 对象来表示柱,并设置相关属性,例如颜色、宽度等: ``` QCPBars *bars = new QCPBars(plot->xAxis, plot->yAxis); bars->setWidth(0.5); // 设置柱的宽度 bars->setBrush(QColor(100, 149, 237)); // 设置柱的颜色 ``` 4. 创建一个 QVector 对象来存储柱的数据,并将数据添加到 QCPBars 对象中: ``` QVector<double> data; data << 1 << 2 << 3 << 4 << 5; // 假设这是柱的数据 bars->setData(data); ``` 5. 设置柱的轴范围和标签等信息: ``` plot->xAxis->setRange(0, data.size() + 1); // 设置 x 轴范围 plot->yAxis->setRange(0, 6); // 设置 y 轴范围 plot->xAxis->setLabel("X轴标签"); plot->yAxis->setLabel("Y轴标签"); plot->setTitle("柱示例"); ``` 6. 最后,将 CustomPlot 对象添加到您的布局中,以便在界面上显示出来: ``` QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(plot); setLayout(layout); ``` 这样,您就可以在 Qt 中使用 CustomPlot 绘制柱了。请注意,以上代码只是一个示例,您需要根据自己的需求进行相应的修改。希望对您有所帮助!如果您有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值