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);
}
效果展示
总结
`如果需要这段小功能代码源码可以给我留言。