当前位置: 首页 > article >正文

What a code!

要在前后两个图表之间连接对应的坐标轴刻度点,可以通过在父部件中绘制线条来实现。以下是具体步骤和代码实现:

步骤说明

  1. 重写paintEvent函数:在BigraphpaintEvent中绘制连接线。
  2. 获取刻度值列表:根据每个坐标轴的最小值、最大值和刻度数量生成刻度值。
  3. 转换坐标位置:将刻度值转换为在各自图表中的位置,再转换为父部件中的全局坐标。
  4. 绘制连接线:使用QPainter在对应的刻度点之间绘制线条。

代码实现

Bigraph.h中添加以下内容:
#include <QPainter>

protected:
    void paintEvent(QPaintEvent *event) override;

private:
    void connectAxisTicks(QPainter *painter, QChart *backChart, QLineSeries *backSeries, 
                          QChart *fontChart, QLineSeries *fontSeries, bool isXAxis);
    QList<qreal> getTickValues(QValueAxis *axis);
Bigraph.cpp中添加以下实现:
void Bigraph::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QPen(QColor(Qt::gray), 1, Qt::DotLine));

    // 连接X轴和Y轴的刻度线
    connectAxisTicks(&painter, backChart, backSeries, fontChart, fontSeries, true);  // X轴
    connectAxisTicks(&painter, backChart, backSeries, fontChart, fontSeries, false); // Y轴
}

void Bigraph::connectAxisTicks(QPainter *painter, QChart *backChart, QLineSeries *backSeries, 
                               QChart *fontChart, QLineSeries *fontSeries, bool isXAxis)
{
    // 获取前后图表的坐标轴
    QValueAxis *backAxis = isXAxis ? qobject_cast<QValueAxis*>(backChart->axes(Qt::Horizontal).first()
                                   : qobject_cast<QValueAxis*>(backChart->axes(Qt::Vertical).first());
    QValueAxis *fontAxis = isXAxis ? qobject_cast<QValueAxis*>(fontChart->axes(Qt::Horizontal).first()
                                   : qobject_cast<QValueAxis*>(fontChart->axes(Qt::Vertical).first());
    if (!backAxis || !fontAxis) return;

    // 获取刻度值列表
    QList<qreal> backTicks = getTickValues(backAxis);
    QList<qreal> fontTicks = getTickValues(fontAxis);

    int minCount = qMin(backTicks.size(), fontTicks.size());
    for (int i = 0; i < minCount; ++i) {
        // 转换backChart中的刻度点到全局坐标
        QPointF backPoint;
        if (isXAxis) {
            backPoint = backChart->mapToPosition(QPointF(backTicks[i], backAxis->min()), backSeries);
        } else {
            backPoint = backChart->mapToPosition(QPointF(backAxis->min(), backTicks[i]), backSeries);
        }
        QPoint backViewPos = backChartView->mapFromScene(backPoint);
        QPoint backGlobalPos = backChartView->pos() + backViewPos;

        // 转换fontChart中的刻度点到全局坐标
        QPointF fontPoint;
        if (isXAxis) {
            fontPoint = fontChart->mapToPosition(QPointF(fontTicks[i], fontAxis->min()), fontSeries);
        } else {
            fontPoint = fontChart->mapToPosition(QPointF(fontAxis->min(), fontTicks[i]), fontSeries);
        }
        QPoint fontViewPos = fontChartView->mapFromScene(fontPoint);
        QPoint fontGlobalPos = fontChartView->pos() + fontViewPos;

        // 绘制连接线
        painter->drawLine(backGlobalPos, fontGlobalPos);
    }
}

QList<qreal> Bigraph::getTickValues(QValueAxis *axis)
{
    QList<qreal> ticks;
    qreal min = axis->min();
    qreal max = axis->max();
    int tickCount = axis->tickCount();
    if (tickCount < 2) return ticks;

    qreal step = (max - min) / (tickCount - 1);
    for (int i = 0; i < tickCount; ++i) {
        ticks.append(min + i * step);
    }
    return ticks;
}

说明

  • 坐标转换:使用QChart::mapToPosition将刻度值转换为图表内的坐标,再通过QChartView::mapFromScene转换为视图坐标,最后加上视图在父部件中的位置得到全局坐标。
  • 刻度生成:根据轴的minmaxtickCount生成均匀分布的刻度值。
  • 线条绘制:使用灰色虚线连接对应的刻度点,形成立体效果。

确保两个图表的坐标轴范围和刻度数一致,以保证连接线正确对齐。通过调整QPen的参数可以更改线条样式。


http://www.kler.cn/a/592368.html

相关文章:

  • 【css酷炫效果】纯CSS实现瀑布流加载动画
  • 【Java集合夜话】第2篇:Collection家族,一场优雅的探索之约
  • Java设计模式之外观模式
  • 大数据学习(74)-Hue元数据
  • 2025 年 AI 代码编辑器深度评测:Cursor Pro订阅与解锁自定义 AI 的无限潜能,实战案例全解析
  • stride网络安全威胁 网络安全威胁是什么
  • random_masking 函数测试
  • 【达梦数据库】快速加列参数ALTER_TABLE_OPT使用
  • Qt Creator入门
  • 《UNIX网络编程卷1:套接字联网API》第2章 传输层:TCP、UDP和SCTP
  • 使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化
  • IvorySQL 增量备份与合并增量备份功能解析
  • 开源模型应用落地-shieldgemma-2-4b-it模型小试-多模态内容安全检测(一)
  • C++ 各种map对比
  • Fragment与React.StrictMode一起使用时有什么需要注意的?
  • 【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(五) -> 添加/删除Module
  • Pandas完全指南:数据处理与分析从入门到实战
  • Netty源码—1.服务端启动流程一
  • 武汉临空港开发区第七批区级非物质文化遗产代表性项目和第四批非遗传承人申报条件流程和材料时间