QScatterSeries相关内容

学习一下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_OBJECT

public:
    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);
        }
    }
}
发布了228 篇原创文章 · 获赞 44 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40945965/article/details/104609487