#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);
|
}
|