主要是记录柱状图的数值显示,散点图的点坐标显示(防止后续忘记,把文件都贴出来,方便复查)
资源库: 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);