qt柱状图_饼状图

在这里插入图片描述
tip:鼠标悬浮提示自定义信息
barchart.h

#ifndef BARCHART_H
#define BARCHART_H
#include <QtCharts/QChartView>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QLegend>
#include <QtCharts/QBarCategoryAxis>
#include "callout.h"
#include <QObject>
#include <QLabel>

QT_CHARTS_USE_NAMESPACE

class barChart:public QGraphicsView
{
    Q_OBJECT
public:


    explicit barChart(QWidget *parent = nullptr);
    QChartView *charView(QString title, QList<qreal> list, QStringList toolTipList, QString chartTip);
    QVector<QBarSet*> m_barSetList;
    QStringList categories;
    QStringList topTipList;
    Callout* m_tooltip;
    QChart *chart;
public  slots:
    void sltTooltip(bool status, int index, QBarSet *barset);

//protected:
//    bool eventFilter(QObject *watched, QEvent *event);
};

#endif // BARCHART_H

barchart.h

#include "barchart.h"
#include <QDebug>


barChart::barChart(QWidget *parent):QGraphicsView(new QGraphicsScene, parent)
{
    chart = new QChart();
}

QChartView *barChart::charView(QString title,QList<qreal> list,QStringList toolTipList,QString interpretationOfData)
{
    m_tooltip = new Callout(chart);
    m_tooltip->hide();
    topTipList=toolTipList;
    //![1]
        QBarSet *set0 = new QBarSet(interpretationOfData);
//        QBarSet *set1 = new QBarSet("John");
            set0->append(list);
//        *set1 << 5 << 0 << 0 << 4 << 0 << 7;

//    m_barSetList<<set0<<set1<<set2<<set3<<set4;
     m_barSetList<<set0;
        QBarSeries *series = new QBarSeries();
        series->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd); // 设置数据系列标签的位置于数据柱内测上方
        series->setLabelsVisible(true); // 设置显示数据系列标签
        installEventFilter(series);
        connect(series, SIGNAL(hovered(bool, int, QBarSet*)), this, SLOT(sltTooltip(bool, int, QBarSet*)));
        series->append(set0);
//        series->append(set1);

        chart->addSeries(series);
        chart->setTitle(title);
        chart->setTitleFont(QFont("song", 12, QFont::Bold));
        chart->setAnimationOptions(QChart::SeriesAnimations);
        for(int i=0;i<list.size();i++)
        {
            categories<<QString("检查项%1").arg(QString::number(i+1));
        }
        QBarCategoryAxis *axis = new QBarCategoryAxis();
        axis->append(categories);
        chart->createDefaultAxes();
        chart->setAxisX(axis, series);

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

        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        return chartView;
}

void barChart::sltTooltip(bool status, int index, QBarSet *barset)
{
    if (m_tooltip == 0)
        m_tooltip = new Callout(chart);

    if (status) {
        double indexbarset=m_barSetList.indexOf(barset)-1;//m_categories是x轴坐标
        indexbarset=indexbarset/6;
        m_tooltip->setText(topTipList.at(index));
        QPointF point(index+indexbarset, barset->at(index));
        m_tooltip->setAnchor(point);
        m_tooltip->setZValue(11);
        m_tooltip->updateGeometry();
        m_tooltip->show();
    }
    else {
        m_tooltip->hide();

    }
}
















//bool barChart::eventFilter(QObject *watched, QEvent *event)
//{
//    if(watched == this)
//    {
//        if(event->type() == QEvent::Enter)
//        {
//            qDebug()<<tr("监控到按钮事件,鼠标进入按钮事件");
//            return true;
//        }
//        else if(event->type() == QEvent::Leave)
//        {
//            qDebug()<<tr("监控到按钮事件,鼠标离开按钮事件");
//            return true;
//        }
//        else if(event->type() == QEvent::MouseButtonPress)
//        {
//            qDebug()<<tr("监控到按钮事件,鼠标摁下按钮事件");
//            return true;
//        }
//        else if(event->type() == QEvent::MouseButtonRelease)
//        {
//            qDebug()<<tr("监控到按钮事件,鼠标释放按钮事件");
//            return true;
//        }
//    }
//    return QWidget::eventFilter(watched, event);
//}

callout.h

/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Charts module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef CALLOUT_H
#define CALLOUT_H

#include <QtCharts/QChartGlobal>
#include <QtWidgets/QGraphicsItem>
#include <QtGui/QFont>

QT_BEGIN_NAMESPACE
class QGraphicsSceneMouseEvent;
QT_END_NAMESPACE

QT_CHARTS_BEGIN_NAMESPACE
class QChart;
QT_CHARTS_END_NAMESPACE

QT_CHARTS_USE_NAMESPACE

class Callout : public QGraphicsItem
{
public:
    Callout(QChart *parent);

    void setText(const QString &text);
    void setAnchor(QPointF point);
    void updateGeometry();

    QRectF boundingRect() const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

private:
    QString m_text;
    QRectF m_textRect;
    QRectF m_rect;
    QPointF m_anchor;
    QFont m_font;
    QChart *m_chart;
};

#endif // CALLOUT_H

callout.cpp


/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Charts module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "callout.h"
#include <QtGui/QPainter>
#include <QtGui/QFontMetrics>
#include <QtWidgets/QGraphicsSceneMouseEvent>
#include <QtGui/QMouseEvent>
#include <QtCharts/QChart>
#include <QDebug>
#include <QGraphicsItem>
Callout::Callout(QChart *chart):
    QGraphicsItem(chart),
    m_chart(chart)
{
}

QRectF Callout::boundingRect() const
{
    QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor));
    QRectF rect;
    rect.setLeft(qMin(m_rect.left(), anchor.x()));
    rect.setRight(qMax(m_rect.right(), anchor.x()));
    rect.setTop(qMin(m_rect.top(), anchor.y()));
    rect.setBottom(qMax(m_rect.bottom(), anchor.y()));
    return rect;
}

void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
    Q_UNUSED(widget)
    QPainterPath path;
    path.addRoundedRect(m_rect, 5, 5);

    QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor));
    if (!m_rect.contains(anchor)) {
        QPointF point1, point2;

        // establish the position of the anchor point in relation to m_rect
        bool above = anchor.y() <= m_rect.top();
        bool aboveCenter = anchor.y() > m_rect.top() && anchor.y() <= m_rect.center().y();
        bool belowCenter = anchor.y() > m_rect.center().y() && anchor.y() <= m_rect.bottom();
        bool below = anchor.y() > m_rect.bottom();

        bool onLeft = anchor.x() <= m_rect.left();
        bool leftOfCenter = anchor.x() > m_rect.left() && anchor.x() <= m_rect.center().x();
        bool rightOfCenter = anchor.x() > m_rect.center().x() && anchor.x() <= m_rect.right();
        bool onRight = anchor.x() > m_rect.right();

        // get the nearest m_rect corner.
        qreal x = (onRight + rightOfCenter) * m_rect.width();
        qreal y = (below + belowCenter) * m_rect.height();
        bool cornerCase = (above && onLeft) || (above && onRight) || (below && onLeft) || (below && onRight);
        bool vertical = qAbs(anchor.x() - x) > qAbs(anchor.y() - y);

        qreal x1 = x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * !vertical * (onLeft * 10 - onRight * 20);
        qreal y1 = y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * (above * 10 - below * 20);;
        point1.setX(x1);
        point1.setY(y1);

        qreal x2 = x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * !vertical * (onLeft * 20 - onRight * 10);;
        qreal y2 = y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * (above * 20 - below * 10);;
        point2.setX(x2);
        point2.setY(y2);

        path.moveTo(point1);
        path.lineTo(anchor);
        path.lineTo(point2);
        path = path.simplified();
    }
    painter->setBrush(QColor(255, 255, 255));
    painter->drawPath(path);
    painter->drawText(m_textRect, m_text);
}

void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    event->setAccepted(true);
}

void Callout::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton){
        setPos(mapToParent(event->pos() - event->buttonDownPos(Qt::LeftButton)));
        event->setAccepted(true);
    } else {
        event->setAccepted(false);
    }
}

void Callout::setText(const QString &text)
{
//    qDebug()<<text;
    m_text = text;
    QFontMetrics metrics(QFont("song",10));
    m_textRect = metrics.boundingRect(QRect(0, 0, 400, text.size()*4), Qt::AlignLeft, QString("tooltip"));
    m_textRect.translate(5, 5);
    m_textRect.setWidth(50);
    m_textRect.setHeight(text.size()*4);
    prepareGeometryChange();
    m_rect = m_textRect.adjusted(-5, -5, 5, 5);
}

void Callout::setAnchor(QPointF point)
{
//    qDebug()<<point;
    m_anchor = point;
}

void Callout::updateGeometry()
{
    prepareGeometryChange();
    setPos(m_chart->mapToPosition(m_anchor) + QPoint(10, -50));
}
qt是一个跨平台的应用程序开发框架,它提供了多种图形绘制功能,其中包括曲线图、柱状图饼状图。 曲线图是一种用于展示数据趋势和变化的图表类型。在qt中,可以使用Qt Charts模块来创建曲线图。通过指定横轴和纵轴的坐标值,可以将数据点连接起来,并且可以自定义线条的样式、粗细和颜色等。曲线图可以帮助我们分析数据的变化规律,比如趋势是否递增或递减,以及是否存在峰值或谷值等。 柱状图是一种用于比较不同数据之间差异的图表类型。在qt中,可以使用Qt Charts模块来创建柱状图。每个数据点都可以表示为一个条形,其长度与数据的大小成比例。柱状图通常用于比较不同类别或时间的数据,例如销售额、人口统计和学生成绩等。通过柱状图,我们可以直观地了解数据之间的差异,以及它们的相对大小。 饼状图是一种用于展示数据占比的图表类型。在qt中,可以使用Qt Charts模块来创建饼状图饼状图将数据划分为不同的扇形区域,每个区域的角度大小与数据的占比成比例。饼状图通常用于展示相对比例关系,例如各个产品的销售份额或不同地区的人口比例等。通过饼状图,我们可以直观地了解各个数据项占总体的比例大小。 在qt中,曲线图、柱状图饼状图都可以根据需求进行自定义,包括图表样式、颜色、数据标签和图例等。它们的创建和显示都相对简单,使得我们可以方便地进行数据分析和展示。无论是用于科学研究、商业决策还是教育培训等领域,这些图表类型都能够提供直观的数据展示方式,帮助我们更好地理解和利用数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值