• Qt自己画个Y轴,如何和qcustomplot建立的X轴原点对齐?


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 蜡笔小欣丫 2024-04-24 21:06 采纳率: 0% 浏览 4 首页/ 编程语言 / Qt自己画个Y轴,如何和qcustomplot建立的X轴原点对齐? qt 现在我用qcustomplot创建了个x轴,然后直接画了个竖线当Y轴,如何能使得我画的竖线和建立的X轴原点对齐呢?并且最终我窗口进行缩放,Y和X轴的相对位置不变! 或者qcustomplot创建的X轴,如何获取原点的位置呢?(创建的X轴其实位于创建的画布矩形里面,我设定的大小是X轴所在的矩形画布大小,我就是想知道他原点位置)有木有人能解答一下? 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-24 21:06
      关注

      引自免费微信小程序:皆我百晓生

      在Qt中,如果你想要确保自定义的Y轴与QCustomPlot中的X轴原点对齐,并且在缩放时保持相对位置不变,你需要首先获取到QCustomPlot的实际绘图区域的坐标。这个区域通常不包括坐标轴、标题、网格线等元素。你可以通过axisRect()方法获取到QCustomPlot的AxisRect对象,然后使用其vbToPixel()方法将逻辑坐标转换为屏幕像素坐标。

      下面是一个示例代码,展示了如何实现这一目标:

      #include 
      #include "qcustomplot.h"
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
      
          QCustomPlot plot;
          plot.show();
      
          // 设置X轴范围
          plot.xAxis->setRange(0, 10);
          plot.yAxis->setEnabled(false); // 如果不需要显示默认的Y轴,可以禁用它
      
          // 获取绘图区域的左上角逻辑坐标
          QPointF leftUpper = plot.axisRect()->vbToPixel(QPointF(0, plot.plotArea().yMin));
      
          // 在指定的逻辑坐标处绘制Y轴
          QPainter painter(&plot);
          painter.setPen(Qt::black); // 设置线条颜色
          painter.drawLine(leftUpper.x(), leftUpper.y(), leftUpper.x(), plot.plotArea().yMax);
      
          return a.exec();
      }
      

      这段代码会创建一个QCustomPlot,并设置了一个X轴范围。然后,我们获取了绘图区域的左上角的逻辑坐标,这个坐标点对应于X轴的原点。接着,我们使用QPainter在那个逻辑坐标处开始绘制一条垂直线,直到Y轴的最大值,这样就保证了自定义的Y轴与QCustomPlot的X轴原点对齐。

      注意,这种方法在窗口缩放时也能保持Y轴和X轴的相对位置不变,因为逻辑坐标不会随着窗口缩放而变化。但是,如果整个窗口被放大或缩小,这条自定义的Y轴也会相应地放大或缩小,这是正常的,因为它遵循了窗口的缩放比例。如果你不想让Y轴随窗口缩放而改变大小,你可能需要手动调整它的长度,但这通常不是你所期望的行为。

      另外,如果你想获取QCustomPlot的X轴原点的像素坐标,你可以使用上述的方法,只是需要把逻辑坐标设置为X轴的最小值和Y轴的最小值,即(x_min, y_min)

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-04-24 21:06
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      【问题概括】:用户想要在Qt中使用qcustomplot库创建一个X轴,并希望在该X轴上绘制一条Y轴,使其与X轴的原点对齐。同时,用户希望在窗口缩放时,Y轴与X轴的相对位置保持不变。

      【问题出现原因】:用户可能不熟悉qcustomplot库的具体用法,或者不了解如何在Qt中进行坐标系的自定义和对齐操作。

      【问题解决方案】:为了解决这个问题,可以采取以下步骤:

      1. 使用qcustomplot提供的坐标轴对象来创建Y轴,而不是直接绘制一条线。
      2. 设置Y轴的原点位置,使其与X轴的原点对齐。
      3. 确保在窗口缩放时,坐标轴的缩放行为是同步的。

      【提供代码】:以下是使用qcustomplot创建X轴和Y轴并使它们原点对齐的示例代码:

      #include 
      #include 
      #include 
      
      class PlotWidget : public QWidget {
          QCustomPlot *plot;
      public:
          PlotWidget(QWidget *parent = nullptr) : QWidget(parent) {
              plot = new QCustomPlot(this);
              plot->setGeometry(0, 0, width(), height());
              plot->setMinimumSize(600, 400);
              plot->setInteraction(QCP::iRangeDrag | QCP::iRangeZoom);
      
              // 创建X轴和Y轴
              QCPAxis *xAxis = plot->xAxis;
              QCPAxis *yAxis = plot->yAxis;
      
              // 设置Y轴的原点与X轴的原点对齐
              yAxis->setRange(-10, 10); // 设置Y轴的范围,确保原点在范围内
              yAxis->setVisible(true);
      
              // 将坐标轴添加到图表中
              plot->addAxis(xAxis);
              plot->addAxis(yAxis);
      
              // 重新计算并更新图表
              plot->replot();
          }
      
          QSize sizeHint() const override {
              return QSize(600, 400);
          }
      };
      
      #include "main.moc"
      
      int main(int argc, char *argv[]) {
          QApplication app(argc, argv);
          PlotWidget widget;
          widget.show();
          return app.exec();
      }
      

      【示例代码运行方式】:将上述代码复制到Qt项目的源文件中,并确保已经包含了qcustomplot库。然后编译并运行程序。

      【示例代码预期运行结果】:程序将显示一个包含X轴和Y轴的图表,Y轴的原点与X轴的原点对齐。当窗口大小改变时,图表会相应地缩放,但X轴和Y轴的相对位置保持不变。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-24 21:06
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      根据问题描述,我了解到你希望在Qt中手动绘制一个Y轴,并且想要它与QCustomPlot所创建的X轴相对位置固定不变。同时,你也想要获取QCustomPlot创建的X轴原点的位置。

      下面是解决方案:

      1. 创建手动绘制的Y轴
        • 首先,在QCustomPlot上创建一个新的图层,并将其设置为“背景”图层
        • 然后,我们可以用QPainter类绘制我们自己的Y轴
        • 请注意,在绘制Y轴时,我们需要考虑QCustomPlot创建的X轴的宽度和位置,以确保它们固定在一起

      修改后的代码如下(假设QCustomPlot对象名为mCustomPlot和绘制的Y轴宽度为2):

          // 创建背景图层
          mCustomPlot->addLayer("myLayer", mCustomPlot->layer("background"), QCustomPlot::limBelow);
      
          // 获取X轴原点位置
          double xAxisBase = mCustomPlot->xAxis->pixelToCoord(mCustomPlot->axisRect()->left());
      
          // 绘制Y轴
          QPainter painter(mCustomPlot);
          painter.setPen(QPen(Qt::black, 2));
          painter.drawLine(xAxisBase, mCustomPlot->axisRect()->top(), xAxisBase, mCustomPlot->axisRect()->bottom());
      
          // 将手动绘制的图层移动到X轴下面
          mCustomPlot->moveLayer(mCustomPlot->layer("myLayer"), mCustomPlot->layer("xAxis"));
      
      1. 使Y轴与X轴原点对齐
        • 如果想要使Y轴与X轴原点对齐,我们需要找到X轴原点的位置并相应地移动手动绘制的Y轴
        • 一种方法是在QCustomPlot实例的resizeEvent()函数中获取并更新X轴原点的位置,并重新绘制手动绘制的Y轴

      用QCustomPlot实例的resizeEvent()函数更新Y轴位置的例子代码如下:

      void MyCustomPlot::resizeEvent(QResizeEvent *event)
      {
          QCustomPlot::resizeEvent(event);
      
          // 获取X轴原点位置
          double xAxisBase = xAxis->pixelToCoord(axisRect()->left());
      
          // 移动并重新绘制Y轴
          yLine->start->setCoords(xAxisBase, axisRect()->top());
          yLine->end->setCoords(xAxisBase, axisRect()->bottom());
      }
      
      1. 确保相对位置不变
        • 要使手动绘制的Y轴和QCustomPlot创建的X轴的相对位置固定,我们可以在绘制Y轴时,使用X轴的像素坐标而不是坐标轴坐标来计算原点位置
        • 这样,无论QCustomPlot实例的大小如何变化,Y轴和X轴始终保持相对位置不变

      修改后的代码如下:

          // 创建背景图层
          mCustomPlot->addLayer("myLayer", mCustomPlot->layer("background"), QCustomPlot::limBelow);
      
          // 获取X轴原点的像素坐标
          double xAxisBase = mCustomPlot->axisRect()->left();
      
          // 将像素坐标转换为坐标轴坐标,并绘制Y轴
          QCPRange xRange = mCustomPlot->xAxis->range();
          double xRatio = xRange.size() / mCustomPlot->axisRect()->width();
          painter.drawLine(mCustomPlot->xAxis->pixelToCoord(xAxisBase), mCustomPlot->yAxis->range().lower, mCustomPlot->xAxis->pixelToCoord(xAxisBase), mCustomPlot->yAxis->range().upper);
      
          // 将手动绘制的图层移动到X轴下面
          mCustomPlot->moveLayer(mCustomPlot->layer("myLayer"), mCustomPlot->layer("xAxis"));
      

      希望这能帮助你解决问题!

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    数电笔记总结(二)(逻辑代数基础)
    Panda3d 场景管理
    数据驱动!精细化运营!用机器学习做客户生命周期与价值预估!⛵
    微服务框架 SpringCloud微服务架构 3 Eureka 3.2 Eureka 原理分析
    【BUG记录】Python中的相对文件路径
    ES状态查询相关API
    Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
    [SDK]Unity接入Sign in with Apple
    xtrabackup相关参数
    pytorch安装教程
  • 原文地址:https://ask.csdn.net/questions/8094384