wumu
16 小时以前 8f4eb9a829d70a28c1d6dff8baa1034e57878c56
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "bargraphics.h"
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QToolTip>
#include <qmath.h>
 
BarGraphics::BarGraphics(QWidget *parent) : QWidget(parent)
{
    m_rankSet = new QBarSet("排名",this);
    m_amountSet = new QBarSet("交易额",this);
    m_barSeries = new QBarSeries(this);
    m_chart = new QChart();
    m_barAxis = new QBarCategoryAxis(this);
    m_chartView = new QChartView(this);
 
    m_hLayout = new QHBoxLayout(this); // 放到水平布局中
 
    m_chart->setTitle("灵动策略1");
 
}
 
BarGraphics::BarGraphics(QVector<int> &rank, QVector<double> &amount, QStringList &timeAxis, QString name, QWidget *parent): QWidget(parent)
{
    m_rankSet = new QBarSet("排名",this);
    m_amountSet = new QBarSet("交易额",this);
    m_barSeries = new QBarSeries(this);
    m_chart = new QChart();
    m_barAxis = new QBarCategoryAxis(this);
    m_chartView = new QChartView(this);
 
    m_hLayout = new QHBoxLayout(this); // 放到水平布局中
    m_chart->setTitle(name);
    m_chart->setAnimationOptions(QChart::SeriesAnimations);
 
    for(int i=0;i<rank.size();++i){
        m_rankSet->append(rank[i]);
        m_amountSet->append(amount[i]);
    }
    //m_barSeries->clear();
    m_barSeries->append(m_rankSet);
    m_barSeries->append(m_amountSet);
 
    m_chart->addSeries(m_barSeries); // 区分一下 添加一次和多次的区别
    m_barAxis->append(timeAxis);
    m_chart->createDefaultAxes();
    m_chart->setAxisX(m_barAxis,m_barSeries);
 
    m_chartView->setChart(m_chart);
    m_hLayout->addWidget(m_chartView);
 
    qDebug()<<"222添加数据完成"<<m_rankSet->count();
 
    m_chart->installEventFilter(this);
}
 
void BarGraphics::addBarData(QVector<int> &rank, QVector<double> &amount,QStringList &timeAxis)
{
    for(int i=0;i<rank.size();++i){
        m_rankSet->append(rank[i]);
        m_amountSet->append(amount[i]);
    }
    //m_barSeries->clear();
    m_barSeries->append(m_rankSet);
    m_barSeries->append(m_amountSet);
 
    m_chart->addSeries(m_barSeries); // 区分一下 添加一次和多次的区别
    m_barAxis->append(timeAxis);
    m_chart->createDefaultAxes();
    m_chart->setAxisX(m_barAxis,m_barSeries);
 
    m_chartView->setChart(m_chart);
    m_hLayout->addWidget(m_chartView);
 
    qDebug()<<"添加数据完成"<<m_rankSet->count();
 
 
}
 
bool BarGraphics::eventFilter(QObject *watched, QEvent *event)
{
 
    if (event->type() == QEvent::GraphicsSceneMouseMove) {
           QGraphicsSceneMouseEvent *mouseEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
           qDebug()<<"GraphicsSceneMouseMove in";
           // 确保不是拖拽操作且鼠标在图表区域内
           if (mouseEvent->buttons() == Qt::NoButton) {
               QPointF scenePos = mouseEvent->scenePos();
               QRectF plotArea = qobject_cast<QChart*>(watched)->plotArea();
               qDebug()<<"GraphicsSceneMouseMove in1111";
               if (plotArea.contains(scenePos)) {
                   QBarSeries *series = watched->findChild<QBarSeries*>();
                   qDebug()<<"GraphicsSceneMouseMove in2222";
                   if (series) {
                       QList<QBarSet*> sets = series->barSets();
                       for (QBarSet *set : sets) {
                           // 计算鼠标所在的柱子索引
                           qreal categorySize = plotArea.width() / series->count();
                           int categoryIndex = qFloor((scenePos.x() - plotArea.x()) / categorySize);
 
                           if (categoryIndex >= 0 && categoryIndex < set->count()) {
                               qreal value = set->at(categoryIndex);
                               QToolTip::showText(
                                   mouseEvent->screenPos(),
                                   QString("值: %1").arg(value),
                                   qobject_cast<QWidget*>(watched)
                               );
 
                               qDebug()<<"GraphicsSceneMouseMove in3333";
 
                               return true;
                           }
                       }
                   }
               }
           }
       }
       else if (event->type() == QEvent::Leave) {
           // 更可靠的鼠标离开事件处理
           QToolTip::hideText();
           return true;
       }
       else if (event->type() == QEvent::ToolTip) {
           // 阻止默认工具提示行为
           return true;
       }
    return QWidget::eventFilter(watched,event);
}