qt柱状图_饼状图

qt柱状图_饼状图_第1张图片
tip:鼠标悬浮提示自定义信息
barchart.h

#ifndef BARCHART_H
#define BARCHART_H
#include 
#include 
#include 
#include 
#include 
#include "callout.h"
#include 
#include 

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 


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<
     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()<
//            return true;
//        }
//        else if(event->type() == QEvent::Leave)
//        {
     
//            qDebug()<
//            return true;
//        }
//        else if(event->type() == QEvent::MouseButtonPress)
//        {
     
//            qDebug()<
//            return true;
//        }
//        else if(event->type() == QEvent::MouseButtonRelease)
//        {
     
//            qDebug()<
//            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 
#include 
#include 

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 
#include 
#include 
#include 
#include 
#include 
#include 
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()<
    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()<
    m_anchor = point;
}

void Callout::updateGeometry()
{
     
    prepareGeometryChange();
    setPos(m_chart->mapToPosition(m_anchor) + QPoint(10, -50));
}

你可能感兴趣的:(qt)