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

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的参数可以更改线条样式。

相关文章:

  • 网格交易中倍数委托的实现方法
  • 软考程序员考试知识点汇总
  • 华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT
  • 漏洞知识点《Tornado框架中RequestHandler的对象》
  • 英语词性--连词
  • Model Context Protocol - Prompts
  • 智慧楼宇:科技编织的未来生活图景
  • dart学习记录3(函数)
  • 三.ffmpeg对yuv的操作
  • SSH连接中断原因分析(SSH断开、SSH中断、SSH连接断开、远程断开、远程中断)(带宽不足、网络抖动与丢包、CPU资源耗尽、内存不足、磁盘I/O瓶颈)
  • 解锁物联网高效开发,Synaptics SYN43756E Wi-Fi 6E 芯片登场
  • 打造无缝智慧照明场景,涂鸦智能全新发布蓝牙Mesh照明解决方案
  • AI Agent系列(六) -基于ReAct架构搭建LLM Agent(Deepseek)
  • C语言中的函数
  • 动平衡仿真程序设计
  • SpringSecurity——如何获取当前登录用户的信息
  • jekins启动失败排查
  • matrix-breakout-2-morpheus通关攻略
  • 蓝桥杯 - 中等 - 新手引导
  • Oracle数据库与MySQL数据库的全面对比分析
  • 重庆荣昌区委区政府再设“答谢宴”,邀请800余名志愿者机关食堂用餐
  • 明查|哈佛大学批改美教育部长来信,红笔标出语法错误?
  • “毛茸茸”的画,诗意、温暖又治愈
  • 2025世界数字教育大会将于5月14日至16日在武汉举办
  • 毕赣新作《狂野时代》入围戛纳主竞赛单元,易烊千玺舒淇主演
  • 陈丹燕:赤龙含珠