Qt_QChart的使用记录(小白)


  

主要是记录柱状图的数值显示,散点图的点坐标显示(防止后续忘记,把文件都贴出来,方便复查)

资源库: WarehouseInputOrOutput.pro
 1 QT       += core gui
 2 QT += charts
 3 
 4 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 5 
 6 TARGET = WarehouseInputOrOutput
 7 TEMPLATE = app
 8 
 9 DEFINES += QT_DEPRECATED_WARNINGS
10 
11 SOURCES += main.cpp\
12         warehouseinputoroutput.cpp \
13         callout.cpp
14 
15 HEADERS  += warehouseinputoroutput.h \
16             callout.h
17 
18 FORMS    += warehouseinputoroutput.ui

 

头文件:WarehouseInputOrOutput.h

 1 #ifndef WAREHOUSEINPUTOROUTPUT_H
 2 #define WAREHOUSEINPUTOROUTPUT_H
 3 
 4 #include <QMainWindow>
 5 #include <QtCharts/QChartView>
 6 #include <QtCharts>
 7 
 8 namespace Ui {
 9 class WarehouseInputOrOutput;
10 }
11 
12 class WarehouseInputOrOutput : public QMainWindow
13 {
14     Q_OBJECT
15 
16 public:
17     explicit WarehouseInputOrOutput(QWidget *parent = 0);
18     ~WarehouseInputOrOutput();
19     void initData();
20     QChart* setBarData();
21     QChart* setSeatterData();
22     QChart* setChartNature(QChart* chart);
23 
27 private:
28     Ui::WarehouseInputOrOutput *ui;
29
33 };
34 
35 #endif // WAREHOUSEINPUTOROUTPUT_H

 

 

定义:WarehouseInputOrOutput.cpp

  1 #include "warehouseinputoroutput.h"
  2 #include "ui_warehouseinputoroutput.h"
  3 #include <QtCharts/QValueAxis>
  4 #include <QtCharts>
  5 #include <qlabel.h>
  7 #include <QtGui/QMouseEvent>
  8 #include <QtWidgets/QGridLayout>
  9 #include <QtWidgets/QHBoxLayout>
 10 
 11 WarehouseInputOrOutput::WarehouseInputOrOutput(QWidget *parent) :
 12     QMainWindow(parent),
 13     ui(new Ui::WarehouseInputOrOutput)
 14 {
 15 
 16     ui->setupUi(this);
 17 
 18     initData();
 19 }
 20 
 21 WarehouseInputOrOutput::~WarehouseInputOrOutput()
 22 {
 23     delete ui;
 24 }
 25 
 26 QChart* WarehouseInputOrOutput::setChartNature(QChart* chart)
 27 {
 28 
 29     chart->setTheme(QChart::ChartThemeLight); // 设置白色主题
 30     chart->setDropShadowEnabled(true); // 背景阴影
 31 //    chart->addSeries(series);    // 数据关联
 32     chart->setTitleBrush(QBrush(QColor(0, 0, 255)));     // 设置标题Brush
 33     chart->setTitleFont(QFont("宋体"));    // 设置标题字体
 34 
 35     chart->legend()->setVisible(true);
 36     chart->legend()->setAlignment(Qt::AlignBottom);  // 对齐方式:底部对齐
 37     chart->legend()->setBackgroundVisible(true);     //  设置背景 可见
 38     chart->legend()->setAutoFillBackground(true);    // 自动填充背景
 39     chart->legend()->setColor(QColor(222, 233, 251));
 40     chart->legend()->setLabelColor(QColor(0, 100, 255));
 41 //    chart->legend()->setMaximumHeight(50);   // 设置高度
 42 //    chart->legend()->hide();
 43 
 44     return chart;
 45 }
 46 
 47 QChart* WarehouseInputOrOutput::setBarData()
 48 {
 49     QChart* barChart = new QChart();
 50     QBarSet* set0 = new QBarSet("入库数");
 51     QBarSet* set1 = new QBarSet("出库数");
 52     QBarSet* set2 = new QBarSet("存量数");
 53     int maxXCount = 10;
 54     int maxYCount = 1000;
 55 
 56     // testData
 57     QMap<int, int> barData;
 58     for(int i = 0; i < 10; ++i)
 59     {
 62         barData[i] = i * 100 + 10;
 63     }
 64     for(int i = 0; i < 10;++i)
 65     {
 66         set0->append(barData[i]);
 67         set1->append(barData[9 - i]);
 68     }
 69     for(int i = 0; i < maxXCount; ++ i)
 70     {
 71         set2->append(i * 100);
 72     }
 73     set0->setLabelColor(Qt::black);
 74     set1->setLabelColor(Qt::red);
 75     set2->setLabelColor(Qt::cyan);
 76 
 77     QBarSeries* series = new QBarSeries();
 78     series->append(set0);
 79     series->append(set1);
 80     series->append(set2);
 81     series->setVisible(true);
 82     series->setLabelsVisible(true);
 83     // 柱状图数字显示在最上方
 84     series->setLabelsPosition(QAbstractBarSeries::LabelsInsideBase);
 85 
 91     setChartNature(barChart);
 92     barChart->addSeries(series);
 93     barChart->setTitle("出入库统计");
 94 
 95     QCategoryAxis*  axisX = new QCategoryAxis();
 98     axisX->setStartValue(-0.5);
 99     for(int i = 1; i < maxXCount + 1; ++ i)
100         axisX->append("物料" + QString::number(i), i - 0.5);
101 
102     QValueAxis *axisY = new QValueAxis;
103     axisY->setRange(0, maxYCount);   //改为setRange(0,1);则表示坐标为动态计算大小的
104     axisY->setTitleText("数量");
105     axisY->setLabelFormat("%d");
106 
107     barChart->setAxisX(axisX, series);
108     barChart->setAxisY(axisY, series);
109     series->attachAxis(axisX);
110     series->attachAxis(axisY);
120 
121     return barChart;
122 }
123 
124 QChart* WarehouseInputOrOutput::setSeatterData()
125 {
126     QChart* seatterChart = new QChart();
127     int maxXCount = 10;
128     int maxYCount = 10000;
129     setChartNature(seatterChart);
130     seatterChart->setTitle("存量数");
131 
132     QCategoryAxis* axisX = new QCategoryAxis();
133 //    axisX->setMin(0);
134     axisX->setMax(maxXCount);
135     axisX->setStartValue(0);
136     for(int i = 1; i < maxXCount + 1; ++ i)
137         axisX->append("timer" + QString::number(i), i);
138 
139     QValueAxis* axisY = new QValueAxis();
140     axisY->setRange(0, maxYCount);
141     axisY->setTitleText("存量");
142     axisY->setLabelFormat("%d");
143     QScatterSeries* seatter = new QScatterSeries();
144     for(int i = 1;i < maxXCount + 1; ++i)
145         seatter->append(i - 0.5, i * 1000);
146     seatter->setPen(QPen(Qt::NoPen));
147     seatter->setColor(QColor(250, 220, 0));
148     // 设置散点大小
149     seatter->setMarkerSize(25);
150     // 设置散点样式
151 //    seatter->setMarkerShape(QScatterSeries::MarkerShapeRectangle);
152     seatter->setName("存量");
153     // 显示设定点的坐标值
154     seatter->setPointLabelsFormat("(@xPoint, @yPoint)");
155     seatter->setPointLabelsVisible(true);
156 
159     seatterChart->addSeries(seatter);
157 seatter->attachAxis(axisX); 158 seatter->attachAxis(axisY);160 seatterChart->setAxisX(axisX, seatter); 161 seatterChart->setAxisY(axisY, seatter); 162 163 return seatterChart; 164 } 165 166 void WarehouseInputOrOutput::initData() 167 { 168 QChart* barChart = new QChart(); 169 barChart = setBarData(); 170 QChartView* showChart = new QChartView(barChart); 171 172 QChart* seatterChart = new QChart(); 173 seatterChart = setSeatterData(); 174 QChartView* showSeatter = new QChartView(seatterChart); 175 176 QGridLayout* gridLayout = new QGridLayout(); 177 gridLayout->addWidget(showSeatter, 1, 0); 178 gridLayout->addWidget(showChart, 2, 0); 179 resize(820, 600); 180 ui->centralWidget->setLayout(gridLayout); 181 182 return; 183 }

 

mian.cpp

 1 #include "warehouseinputoroutput.h"
 2 #include <QApplication>
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     WarehouseInputOrOutput w;
 8     w.show();
 9 
10     return a.exec();
11 }

 

补充个更新的函数,以便后续自查
  1 // 更新坐标轴和数据
  2 void WarehouseInputOrOutput::updateShow()
  3 {
  4     qDebug() << "enter the updateShow";
  5     // 需计算的前置参数
  6     int maxXCount = 4;      // x轴分割为几块
  7     int maxYCount = 1000;   // 出入库的浮动上限(传参时加10%方便显示)
  8     int maxSeaterY = 10000; // 实际存量的上限(传参时加20%方便显示坐标)
  9 
 10     QBarSet* set0 = new QBarSet("入库数");
 11     QBarSet* set1 = new QBarSet("出库数");
 12     set0->setLabelColor(Qt::black);
 13     set1->setLabelColor(Qt::red);
 14 
 15     int i = 0;
 16     QMap<QString, int>::const_iterator inIt;
 17     QMap<QString, int>::const_iterator outIt;
 18     for(inIt = m_InputSum.begin(), outIt = m_OutputSum.begin();i < maxXCount && inIt != m_InputSum.end() && outIt != m_OutputSum.end();++inIt, ++ outIt)
 19     {
 20         set0->append(inIt.value());
 21         set1->append(outIt.value());
 22         ++i;
 23     }
 24 
 25     // 出库数、入库数、存量数、日期
 26     for(int i = 0; i < maxXCount; ++i)
 27     {
 28         m_OutputSum["物料" + QString::number(i)] = i * 20;
 29         m_InputSum["物料" + QString::number(i)] = i * 100;
 30         m_StockSum["物料" + QString::number(i)] = i * 1000;
 31     }
 32     m_date = QDateTime::currentDateTime().toString("yyyy/MM/dd");
 33 
 34     m_barChart->removeAllSeries();
 35     QBarSeries* newSeries = new QBarSeries();
 36     newSeries->append(set0);
 37     newSeries->append(set1);
 38     newSeries->setVisible(true);
 39     newSeries->setLabelsVisible(true);
 40     // 柱状图数字显示在最上方
 41     newSeries->setLabelsPosition(QAbstractBarSeries::LabelsInsideBase);
 42     m_barChart->addSeries(newSeries);
 43 
 44     // 移除原有数据,后续更新数据(update动作必须先移除原数据)
 45     m_barChart->removeAxis(m_barChart->axisX());
 46     m_barChart->removeAxis(m_barChart->axisY());
 47 
 48     QCategoryAxis*  axisX = new QCategoryAxis();
 49     axisX->setStartValue(-0.5);
 50     i = 1;  // 辅助位置
 51     for(inIt = m_InputSum.begin(); inIt != m_InputSum.end() && i < maxXCount;++inIt)
 52         axisX->append(inIt.key(), i++ - 0.5);
 53 
 54     QValueAxis *axisY = new QValueAxis;
 55     axisY->setRange(0, maxYCount * 1.1);
 56     axisY->setTitleText("数量");
 57     axisY->setLabelFormat("%d");
 58     m_barChart->setAxisX(axisX, newSeries);
 59     m_barChart->setAxisY(axisY, newSeries);
 60     // 数据匹配坐标轴
 61     newSeries->attachAxis(axisX);
 62     newSeries->attachAxis(axisY);
 63 
 64 
 65     // 更新散点图数据
 66     QScatterSeries* newSeatter = new QScatterSeries();
 67     for(int i = 1;i < maxXCount + 1; ++i)
 68         newSeatter->append(i - 0.5, i * 1000);
 69     // 设置散点大小
 70     newSeatter->setMarkerSize(15);
 71     newSeatter->setName("存量");
 72     // 显示设定点的值
 73     newSeatter->setPointLabelsFormat("@yPoint");
 74     newSeatter->setPointLabelsVisible(true);
 75     m_seatterChart->removeAllSeries();
 76     m_seatterChart->addSeries(newSeatter);
 77 
 78     QCategoryAxis* seatterAxisX = new QCategoryAxis();\
 79     seatterAxisX->setMax(1.1*maxXCount);
 80     seatterAxisX->setStartValue(0);
 81     QMap<QString, int>::const_iterator stockIt;
 82     int i = 1;
 83     for(stockIt = m_StockSum.begin();stockIt != m_StockSum.end();++stockIt)
 84         seatterAxisX->append(stockIt.key(), i++);
 85 
 86     QValueAxis* seatterAxisY = new QValueAxis();
 87     seatterAxisY->setRange(0, 1.2*maxYCount);
 88     seatterAxisY->setTitleText("存量");
 89     seatterAxisY->setLabelFormat("%d");
 90     // 移除原有数据,添加新数据(update动作必须先移除原数据)
 91     m_seatterChart->removeAxis(m_seatterChart->axisX());
 92     m_seatterChart->removeAxis(m_seatterChart->axisY());
 93     m_seatterChart->addAxis(seatterAxisX, newSeatter);
 94     m_seatterChart->addAxis(seatterAxisY, newSeatter);
 95 
 96     // 数据匹配坐标轴
 97     newSeatter->attachAxis(m_seatterChart->axisX());
 98     newSeatter->attachAxis(m_seatterChart->axisY());
 99 
100 
101     update();
102 }

 

 

159     seatterChart->addSeries(seatter);


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM