下面对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轴刻度即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具