posts - 10,comments - 1,views - 23576

下面对QChartView进行封装方便进行绘制:

复制代码
#pragma once

#include <QWidget>
#include <QChart>
#include <QChartView>
#include <QBarSeries>
#include <QBarSet>
#include <QBarCategoryAxis>
#include <QDebug>
#include <QThread>
#include <QValueAxis>
#include <QMenu>
#include "ui_QBarChart.h"

QT_CHARTS_USE_NAMESPACE

class ChartThreadDelegate : public QObject
{
    Q_OBJECT

public:
    explicit ChartThreadDelegate(QObject *parent = nullptr);
    ~ChartThreadDelegate();
    void Working(QMap<QString, QVector<int>> & ValueVector, QBarSeries * BarSeries);
private:
signals:
    void ReturnSeries(QBarSet *);
};

class QBarChart : public QChartView
{
    Q_OBJECT

public:
    QBarChart(QString ChartName,QWidget *parent = Q_NULLPTR);
    ~QBarChart();
    void SetValue(QMap<QString, QVector<int>> & valuemap, QStringList & axisX);
    void ClearSeries();
    void SetAxisYRange(int bottom,int top);
private:
    Ui::QBarChart ui;
    //设置样式
    void SetStyle();
    //chart对象
    QChart Chart;
    //BarSet数量
    int m_BarSetNum;
    //存储柱状图对象
    QBarSeries * BarSeries;
    //坐标
    QBarCategoryAxis  AxisX;
    QValueAxis  AxisY;
    //线程类
    QThread * m_Thread;
    ChartThreadDelegate * m_ChartThreadDelegate;

private:
    QMap<QString, QVector<int>> ValueVector;
    QStringList AxisXValue;
private slots:
    //动态添加柱状图
    void Value();
    void Series(QBarSet *);

protected:
    void mousePressEvent(QMouseEvent *event);
    //鼠标悬停事件
    virtual bool eventFilter(QObject * obj, QEvent * event);
    void contextMenuEvent(QContextMenuEvent *event);
    void createActions();
private:
    QMenu * PopMenu;
    QAction * ClearAction;
private:
signals:
    void selfClicked();

};
复制代码
复制代码
#include "QBarChart.h"
#include <QGraphicsLayout>

QBarChart::QBarChart(QString ChartName,QWidget *parent)
    : QChartView(parent)
{
    ui.setupUi(this);
    //添加视图
    BarSeries = new QBarSeries(&Chart);

    BarSeries->setUseOpenGL(true);
    Chart.addSeries(BarSeries);
    //设置表格名称
    Chart.setTitle(ChartName);
    //坐标轴设置
    Chart.createDefaultAxes();
    Chart.setAcceptTouchEvents(true);
    //x坐标轴设置
    Chart.setAxisX(&AxisX, BarSeries);
    //y坐标轴设置
    AxisY.setRange(0, 100);//显示数值范围
    Chart.setAxisY(&AxisY, BarSeries);
    //视图添加柱状图
    this->setChart(&Chart);

    //取消所有边框
    Chart.layout()->setContentsMargins(0, 0, 0, 0);//设置外边界全部为0
    Chart.setMargins(QMargins(0, 0, 0, 0));//设置内边界全部为0
    Chart.setBackgroundRoundness(0);//设置背景区域无圆角

    //设置样式
    SetStyle();
    //QValueAxis改变是会触发信号
    connect(&AxisX, &QBarCategoryAxis::categoriesChanged, this, &QBarChart::Value);


    m_Thread = new QThread;
    m_ChartThreadDelegate = new ChartThreadDelegate;
    m_ChartThreadDelegate->moveToThread(m_Thread);
    m_Thread->start();

    connect(m_ChartThreadDelegate, &ChartThreadDelegate::ReturnSeries, this, &QBarChart::Series);

    this->setAttribute(Qt::WA_Hover, true);
    this->installEventFilter(this);

    createActions();
}

QBarChart::~QBarChart()
{
}

void QBarChart::SetValue(QMap<QString, QVector<int>> & valuemap, QStringList & axisX)
{
    if (valuemap == ValueVector) {return; }
    ValueVector = valuemap;
    AxisXValue = axisX;
    AxisX.clear();
}

void QBarChart::ClearSeries()
{
    BarSeries->clear();
    ValueVector.clear();
}

void QBarChart::SetAxisYRange(int bottom, int top)
{
    AxisY.setRange(bottom, top);//显示数值范围
}

void QBarChart::SetStyle()
{
    //Chart.setAnimationOptions(QChart::SeriesAnimations);//动画效果
    //BarSeries样式设置
    BarSeries->setLabelsPosition(QAbstractBarSeries::LabelsCenter);//在柱上显示数值方式
    //坐标轴样式设置
    AxisY.setGridLineVisible(false); //设置是否显示网格线
    //标签样式设置
    Chart.legend()->setVisible(true);
    Chart.legend()->setAlignment(Qt::AlignBottom);
    //视图样式设置
    //this->setRubberBand(QChartView::RectangleRubberBand);//拉伸效果
    //this->setRenderHint(QPainter::Antialiasing);
    this->chart()->setTheme(QChart::ChartThemeLight);
    //窗口样式设置
    //QPalette pal = window()->palette();
    //pal.setColor(QPalette::Window, QRgb(0x9e8965));
    //pal.setColor(QPalette::WindowText, QRgb(0x404044));
    //window()->setPalette(pal);
}


void QBarChart::Value()
{
    BarSeries->clear();
    QMapIterator<QString, QVector<int>> ValueMapIteator(ValueVector);
    //m_ChartThreadDelegate->Working(ValueVector, BarSeries);
    while (ValueMapIteator.hasNext())
    {
        ValueMapIteator.next();
        QBarSet * barset = new QBarSet(ValueMapIteator.key());
        QVector<int> ValueVector = ValueMapIteator.value();
        QVector<int>::iterator ValueVectorIterator;
        for (int ValueVectorIterator : ValueVector)
        {
            barset->append(ValueVectorIterator);
        }
        BarSeries->append(barset);
    }
    AxisX.append(AxisXValue);
}

void QBarChart::Series(QBarSet * Set) 
{
    BarSeries->append(Set);
}

void QBarChart::mousePressEvent(QMouseEvent * event)
{
    emit selfClicked();
}

bool QBarChart::eventFilter(QObject * obj, QEvent * event)
{
    if (event->type() == QEvent::HoverEnter)
    {

        BarSeries->setLabelsVisible(true);//判断是否在图柱上显示数值
        return true;
    }
    if (event->type() == QEvent::Leave)
    {
    
        BarSeries->setLabelsVisible(false);//判断是否在图柱上显示数值
        return true;
    }
    return QWidget::eventFilter(obj, event);
}


ChartThreadDelegate::ChartThreadDelegate(QObject *parent) : QObject(parent)
{

}


ChartThreadDelegate::~ChartThreadDelegate()
{
}

void ChartThreadDelegate::Working(QMap<QString, QVector<int>>& ValueVector, QBarSeries * BarSeries)
{
    BarSeries->clear();
    QMapIterator<QString, QVector<int>> ValueMapIteator(ValueVector);
    while (ValueMapIteator.hasNext())
    {
        ValueMapIteator.next();
        QBarSet * barset = new QBarSet(ValueMapIteator.key());
        QVector<int> ValueVector = ValueMapIteator.value();
        QVector<int>::iterator ValueVectorIterator;
        for (int ValueVectorIterator : ValueVector)
        {
            barset->append(ValueVectorIterator);
        }
        BarSeries->append(barset);
        //emit ReturnSeries(barset);
    }
    
}


void QBarChart::createActions()

{
    //创建菜单、菜单项

    PopMenu = new QMenu();

    ClearAction = new QAction(this);
    ClearAction->setText(QStringLiteral("清空表格"));

    //连接信号与槽

    connect(ClearAction, &QAction::triggered, this, &QBarChart::ClearSeries);

}


void QBarChart::contextMenuEvent(QContextMenuEvent *event)

{
    //清除原有菜单

    PopMenu->clear();

    PopMenu->addAction(ClearAction);


    //菜单出现的位置为当前鼠标的位置

    PopMenu->exec(QCursor::pos());

    event->accept();

}
复制代码

绘制时只需要在ui文件中添加一个QGridLayout对象,然后调用ui.GridLayout->addWidget(mChart);即可完成柱状图添加

更改数据时可通过QBarChart类中的SetValue方法设置柱状图内容,SetAxisYRange方法修改Y轴刻度即可

posted on   青春凹陷  阅读(1246)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示