wumu
2025-02-26 637610bcf851d70657c2dcf251d6daed2429a9a5
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
#include "stockpolicy.h"
#include "ui_stockpolicy.h"
#include <QDebug>
#include <QLegendMarker>
 
#pragma execution_character_set("utf-8")
 
 
 
StockPolicy::StockPolicy(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::StockPolicy)
{
    ui->setupUi(this);
    initUi();
}
 
StockPolicy::~StockPolicy()
{
    delete ui;
}
 
void StockPolicy::initUi()
{
 
    m_chart = new QChart;
    m_chart->setTitle("趋势查看");
    m_chart->setBackgroundBrush(QColor(255,255,255));  // 用于设置背景色的   QColor(10,10,10)  r,g,b 红绿蓝3原色
    QLineSeries *series = new QLineSeries; // 用于存放数据的系列,相当于存了XY对应数据的容器
    series->setName("示例图");
 
    series->append(1686240000000,17.63); // X Y的值
    series->append(1686844800000,19.31);
    series->append(1687276800000,30.11);
    series->append(1688054400000,19.31);
    series->append(1688659200000,50.81);
    m_chart->addSeries(series);
 
    m_dtAx = new QDateTimeAxis;  // X轴,时间轴
    m_dtAx->setFormat("yyyy-MM-dd"); // 设置时间格式
    m_dtAx->setTitleText("时间");
    m_dtAx->setTickCount(10); // 设置网格数
    m_chart->setAxisX(m_dtAx,series);  // 设置 X轴为时间轴、数据
 
    m_axisY = new QValueAxis;  // Y轴
    m_axisY->setTickCount(10); // 设置格数
    m_axisY->setRange(0,1500); // 设置Y值的范围
    m_chart->setAxisY(m_axisY,series);  // 设置 Y轴为数据轴、数据
 
    setLastMarkerShowAndAlpha(); // 设置当前最后一个标记曲线和标签的显示及透明度情况
 
    m_chartView = new QChartView(m_chart);
    // 框选放大,右键缩小
    m_chartView->setRubberBand(QChartView::HorizontalRubberBand); // 设置鼠标左击框选放大,右击缩小
    m_chartView->setRenderHint(QPainter::Antialiasing,true);
    this->setCentralWidget(m_chartView); // 将表视图放到中心部件来显示,可以做到自适应大小
}
 
// 设置当前最后一个标记曲线和标签的显示及透明度情况
void StockPolicy::setLastMarkerShowAndAlpha()
{
    QLegendMarker* marker = m_chart->legend()->markers().back();
    connect(marker,QOverload<>::of(&QLegendMarker::clicked),this,[=]{
        marker->series()->setVisible(!marker->series()->isVisible());  // 取反,可见时不可见,不可见时变可见
        marker->setVisible(true); // 把图例标题显示处理
 
        qreal alpha = 1.0; // 透明度,完全不透明
        if(!marker->series()->isVisible()) alpha = 0.5; // 不可见时透明度 50%
        // 设置透明度相关,主要是设置图例标签的透明度
        QBrush brush = marker->labelBrush();
        QColor color = brush.color();
        color.setAlphaF(alpha);
        brush.setColor(color);
        marker->setLabelBrush(brush);
    });
}
 
void StockPolicy::showNewStockData(QLineSeries *series)
{
 
    m_chart->addSeries(series);  // 添加数据到图表
    m_chart->setAxisX(m_dtAx,series);  // 设置 X轴为时间轴、数据
    m_chart->setAxisY(m_axisY,series);  // 设置 Y轴为数据轴、数据
    setLastMarkerShowAndAlpha(); // 设置当前最后一个标记曲线和标签的显示及透明度情况
}
 
void StockPolicy::showNewStockData(QSplineSeries *series)
{
    m_chart->addSeries(series);  // 添加数据到图表
    m_chart->setAxisX(m_dtAx,series);  // 设置 X轴为时间轴、数据
    m_chart->setAxisY(m_axisY,series);  // 设置 Y轴为数据轴、数据
    setLastMarkerShowAndAlpha(); // 设置当前最后一个标记曲线和标签的显示及透明度情况
}