学习一下Qt Charts的柱状图部分。参考书籍:Qt5.9 C 开发指南
效果图
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QtCharts/QChart>using namespace QtCharts;namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow();private: //创建散点图 void createScatterSeries();private slots: void on_rdoCircle_clicked(); void on_rdoRectangle_clicked(); void on_rdoStar_clicked(); void on_btnScatterColor_clicked(); void on_btnScatterBorderColor_clicked();private: Ui::MainWindow *ui; QPainterPath m_starPath; //保存星形路径};#endif // MAINWINDOW_H
cpp文件
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QScatterSeries>#include <QValueAxis>#include <QtMath>#include <QColorDialog>#include <QDebug>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); QStringList headText = QStringList() << QStringLiteral("产品价格") << QStringLiteral("空调(件)") << QStringLiteral("冰箱(件)") << QStringLiteral("洗衣机(件)") << QStringLiteral("总计(件)"); ui->tableWidget->setHorizontalHeaderLabels(headText); ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); for (int i = 0; i < ui->tableWidget->rowCount(); i ) { int AirConditioner = ui->tableWidget->item(i, 1)->text().toInt(); int Refrigerator = ui->tableWidget->item(i, 2)->text().toInt(); int WashingMachine = ui->tableWidget->item(i, 3)->text().toInt(); int sum = AirConditioner Refrigerator WashingMachine; QTableWidgetItem *item = new QTableWidgetItem(QString::number(sum)); ui->tableWidget->setItem(i, 4, item); } createScatterSeries();}MainWindow::~MainWindow(){ delete ui;}void MainWindow::createScatterSeries(){ ui->chartViewScatter->setRenderHint(QPainter::Antialiasing); ui->chartViewScatter->chart()->setTitle(QStringLiteral("QScatterSeries演示")); ui->chartViewScatter->chart()->setTheme(QChart::ChartThemeBlueCerulean); //创建散点图序列,并添加数据 QScatterSeries *scatterSeries[4]; for (int i = 0; i < 4; i ) { scatterSeries[i] = new QScatterSeries; scatterSeries[i]->setMarkerSize(30.0); } for (int row = 0; row < 4; row ) { scatterSeries[0]->append((row 1) * 1000, ui->tableWidget->item(row, 1)->text().toInt()); scatterSeries[1]->append((row 1) * 1000, ui->tableWidget->item(row, 2)->text().toInt()); scatterSeries[2]->append((row 1) * 1000, ui->tableWidget->item(row, 3)->text().toInt()); scatterSeries[3]->append((row 1) * 1000, ui->tableWidget->item(row, 4)->text().toInt()); } //各物品设置散点样式:圆形 scatterSeries[0]->setMarkerShape(QScatterSeries::MarkerShapeCircle); scatterSeries[1]->setMarkerShape(QScatterSeries::MarkerShapeCircle); scatterSeries[2]->setMarkerShape(QScatterSeries::MarkerShapeCircle); //平均分设置散点样式:星形 m_starPath.moveTo(28, 15); for (int i = 1; i < 5; i) { m_starPath.lineTo(14 14 * qCos(0.8 * i * M_PI), 15 14 * qSin(0.8 * i * M_PI)); } m_starPath.closeSubpath(); QImage star(30, 30, QImage::Format_ARGB32); star.fill(Qt::transparent); QPainter painter(&star); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::white); painter.setBrush(Qt::yellow); painter.drawPath(m_starPath); scatterSeries[3]->setBrush(star); scatterSeries[3]->setPen(QColor(Qt::transparent)); scatterSeries[0]->setName(QStringLiteral("空调")); scatterSeries[1]->setName(QStringLiteral("冰箱")); scatterSeries[2]->setName(QStringLiteral("洗衣机")); scatterSeries[3]->setName(QStringLiteral("总计")); for (int i = 0; i < 4; i ) { ui->chartViewScatter->chart()->addSeries(scatterSeries[i]); } //坐标轴 QValueAxis *axisX = new QValueAxis; QValueAxis *axisY = new QValueAxis; axisX->setRange(0, 5000); axisX->setTickCount(6); axisX->setTitleText(QStringLiteral("产品价格(元)")); axisX->setLabelFormat("%d"); axisX->setVisible(true); axisY->setRange(0, 300); axisY->setTitleText(QStringLiteral("销售数量(件)")); axisY->setLabelFormat("%d"); axisY->setVisible(true); for (int i = 0; i < 4; i ) { ui->chartViewScatter->chart()->setAxisX(axisX, scatterSeries[i]); ui->chartViewScatter->chart()->setAxisY(axisY, scatterSeries[i]); } //图例 ui->chartViewScatter->chart()->legend()->setAlignment(Qt::AlignRight); ui->chartViewScatter->chart()->legend()->setMarkerShape(QLegend::MarkerShapeFromSeries);}void MainWindow::on_rdoCircle_clicked(){ //各物品设置散点样式:圆形 QList<QAbstractSeries *> lisSeries = ui->chartViewScatter->chart()->series(); for (int i = 0; i < 3; i ) { QScatterSeries *series = dynamic_cast<QScatterSeries *>(lisSeries.at(i)); series->setMarkerShape(QScatterSeries::MarkerShapeCircle); series->setBrush(Qt::green); series->setPen(QPen(Qt::white, 2)); }}void MainWindow::on_rdoRectangle_clicked(){ //各物品设置散点样式:矩形 QList<QAbstractSeries *> lisSeries = ui->chartViewScatter->chart()->series(); for (int i = 0; i < 3; i ) { QScatterSeries *series = dynamic_cast<QScatterSeries *>(lisSeries.at(i)); series->setMarkerShape(QScatterSeries::MarkerShapeRectangle); series->setBrush(Qt::green); series->setPen(QPen(Qt::white, 2)); }}void MainWindow::on_rdoStar_clicked(){ //各物品设置散点样式:星形 QImage star(30, 30, QImage::Format_ARGB32); star.fill(Qt::transparent); QPainter painter(&star); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::white); painter.setBrush(Qt::green); painter.drawPath(m_starPath); QList<QAbstractSeries *> lisSeries = ui->chartViewScatter->chart()->series(); for (int i = 0; i < 3; i ) { QScatterSeries *series = dynamic_cast<QScatterSeries *>(lisSeries.at(i)); series->setBrush(star); series->setPen(QColor(Qt::transparent)); }}void MainWindow::on_btnScatterColor_clicked(){ QColor color(Qt::white); QColorDialog dlg(color); if (dlg.exec() == QDialog::Accepted) { color = dlg.currentColor(); QList<QAbstractSeries *> lisSeries = ui->chartViewScatter->chart()->series(); for (int i = 0; i < 3; i ) { QScatterSeries *series = dynamic_cast<QScatterSeries *>(lisSeries.at(i)); series->setBrush(color); series->setPen(QColor(Qt::white)); } }}void MainWindow::on_btnScatterBorderColor_clicked(){ QColor color(Qt::white); QColorDialog dlg(color); if (dlg.exec() == QDialog::Accepted) { color = dlg.currentColor(); QList<QAbstractSeries *> lisSeries = ui->chartViewScatter->chart()->series(); for (int i = 0; i < 3; i ) { QScatterSeries *series = dynamic_cast<QScatterSeries *>(lisSeries.at(i)); series->setPen(color); } }}
联系客服