栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QChart绘制占比图,但是以时间轴为X轴

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QChart绘制占比图,但是以时间轴为X轴

需求:需要绘制比例图,而且是随着时间不停地增加,比例直方图会越来越多,x轴的字符串也越来越多,但随着变多,x轴会被省略掉,所以我需要能够动态增删X轴的直方图,既不丢失数据又不增多X轴的字符串;

问题:发现Qt的QStackedBarSeries 是与QBarCategoryAxis 搭配,但是QBarCategoryAxis 不支持setTickCount 功能;而QLineSeries和QDateTimeAxis搭配,支持setTickCount,也就支持X轴坐标个数限制;

根本需求:如何让QStackedBarSeries比例图也可以与QDateTimeAxis搭配呢?

有问题上Stack Overflow论坛就行了,我找到了别人的解决方法:

链接:c++ - How to hide some of the categories in QBarCategoryAxis in Qt - Stack Overflow

现在我将我自己的工程代码贴如下:

BarChartWidget.h

#pragma once

#include 
#include 

class QPushButton;

class BarChartWidget : public QWidget
{
    Q_OBJECT
public:
    explicit BarChartWidget(QWidget *parent = nullptr);

private:
    void InitChartCtrl(void);

private:
    QBarSet *m_pBarset0 = nullptr;
    QBarSet *m_pBarset1 = nullptr;
    QBarSet *m_pBarset2 = nullptr;
    QBarSet *m_pBarset3 = nullptr;
    QBarSet *m_pBarset4 = nullptr;

    QStackedBarSeries *m_pStackedBarSeries = nullptr;

    QChart *m_pChart = nullptr;


    QBarCategoryAxis *m_pBarCategoryAxis = nullptr;

    QValueAxis *m_pValueAxisY = nullptr;

    QChartView *m_pChartView = nullptr;

    QPushButton *m_pTestBtn = nullptr;


    QLineSeries *m_plineseries = nullptr;


    QDateTimeAxis *m_pDateTimeAxisX = nullptr;

    qint64 m_minTime;
    qint64 m_maxTime;



signals:
private slots:
    void AddBtnSlot(void);

};

BarChartWidget.cpp 

#include "BarChartWidget.h"
#include 
#include 

BarChartWidget::BarChartWidget(QWidget *parent) : QWidget(parent)
{
    InitChartCtrl();
}


void BarChartWidget::InitChartCtrl(void)
{
    m_pChart = new QChart();

    m_pBarset0 = new QBarSet("Jane");
    m_pBarset1 = new QBarSet("John");
    m_pBarset2 = new QBarSet("Axel");
    m_pBarset3 = new QBarSet("Mary");
    m_pBarset4 = new QBarSet("Samantha");


    m_pStackedBarSeries = new QStackedBarSeries(m_pChart);
    m_plineseries = new QLineSeries(m_pChart);
    m_plineseries->setName("trend");

    m_pStackedBarSeries->append(m_pBarset0);
    m_pStackedBarSeries->append(m_pBarset1);
    m_pStackedBarSeries->append(m_pBarset2);
    m_pStackedBarSeries->append(m_pBarset3);
    m_pStackedBarSeries->append(m_pBarset4);

//    *m_pBarset0 << 1 ;
//    *m_pBarset1 << 3 ;
//    *m_pBarset2 << 4 ;
//    *m_pBarset3 << 2 ;
//    *m_pBarset4 << 4 ;


    m_pChart->addSeries(m_pStackedBarSeries);
    m_pChart->addSeries(m_plineseries);

    m_pChart->setTitle("Simple stackedbarchart example");
    m_pChart->setAnimationOptions(QChart::NoAnimation);

    m_pDateTimeAxisX = new QDateTimeAxis(m_pChart);
    m_pDateTimeAxisX->setFormat("dd-hh:mm:ss");
    m_pDateTimeAxisX->setGridLineVisible(false);
    m_pChart->addAxis(m_pDateTimeAxisX, Qt::AlignBottom);
    m_plineseries->attachAxis(m_pDateTimeAxisX);
//    m_pStackedBarSeries->attachAxis(m_pDateTimeAxisX);

    m_pBarCategoryAxis = new QBarCategoryAxis();
    m_pChart->addAxis(m_pBarCategoryAxis, Qt::AlignBottom);
    m_pStackedBarSeries->attachAxis(m_pBarCategoryAxis);
    //    m_plineseries->attachAxis(m_pValueAxisY);
    m_pBarCategoryAxis->setVisible(false);

    m_pValueAxisY = new QValueAxis(m_pChart);
    m_pChart->addAxis(m_pValueAxisY, Qt::AlignLeft);
    m_pStackedBarSeries->attachAxis(m_pValueAxisY);

    //    m_pDateTimeAxisX->setTickCount(8);
    m_pStackedBarSeries->setBarWidth(1);
    m_pChart->axes(Qt::Vertical,m_pStackedBarSeries).first()->setRange(0,20);
    m_plineseries->setVisible(false);



    m_pChart->legend()->setVisible(true);
    m_pChart->legend()->setAlignment(Qt::AlignBottom);

    m_pChartView = new QChartView(m_pChart);
    m_pChartView->setRenderHint(QPainter::Antialiasing);

    m_pTestBtn = new QPushButton(QStringLiteral("Add"),this);

    QVBoxLayout *pvertlayout =new QVBoxLayout();
    pvertlayout->addWidget(m_pChartView);
    pvertlayout->addWidget(m_pTestBtn);
    setLayout(pvertlayout);

    connect(m_pTestBtn,&QPushButton::clicked,this,&BarChartWidget::AddBtnSlot);

    m_minTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
}


void BarChartWidget::AddBtnSlot(void)
{
    qDebug()<<__FUNCTION__;

    m_pBarCategoryAxis->append(QString::number(m_plineseries->count(),10));

    *m_pBarset0 <<  qrand()%(10);
    *m_pBarset1 <<  qrand()%(10);
    *m_pBarset2 <<  qrand()%(10);
    *m_pBarset3 <<  qrand()%(10);
    *m_pBarset4 <<  qrand()%(10);

    m_maxTime = QDateTime::currentDateTime().toMSecsSinceEpoch();
    *m_plineseries << QPointF(m_maxTime,  qrand()%(10));

    m_pDateTimeAxisX->setTickCount( m_plineseries->count() <= 10 ?  m_plineseries->count()+1 : 10);
    m_pDateTimeAxisX->setRange(QDateTime::fromMSecsSinceEpoch(m_minTime),QDateTime::fromMSecsSinceEpoch(m_maxTime));
}

演示效果:

 

 

源码下载链接:

QChart绘制占比图,但是以时间轴为X轴-C++文档类资源-CSDN下载

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932030.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号