Qwt多个plot坐标轴对齐

博客介绍了在Qwt中遇到多个图表坐标轴刻度范围不一致导致的布局问题,并提出了通过设置QwtScaleDraw的minimumExtent来约束坐标轴范围的解决方案,从而实现轴对齐。通过调用`setMinimumExtent(50)`方法,确保了坐标轴的视觉一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

当Qwt多个Plot并排存在时,如果存在刻度范围不一致时,会导致坐标轴不对齐问题,看起来会很不舒服,网上方法只找到一个,感觉不太好。就自己找了一下!
多个Plot刻度坐标轴不对齐

解决方法

使用QwtScaleDraw中的setMinimumExtent设置坐标轴计算的最小范围约束,最理想的情况是进行动态绑定操作,但是我不会就是😂,得亏发现这个方法

Qwt源码:

/*!
  \brief Set a minimum for the extent

  The extent is calculated from the components of the
  scale draw. In situations, where the labels are
  changing and the layout depends on the extent (f.e scrolling
  a scale), setting an upper limit as minimum extent will
  avoid jumps of the layout.

  \param minExtent Minimum extent

  \sa extent(), minimumExtent()
*/
void QwtAbstractScaleDraw::setMinimumExtent( double minExtent )
{
    if ( minExtent < 0.0 )
        minExtent = 0.0;

    d_data->minExtent = minExtent;
}

/*!
   Calculate the width/height that is needed for a
   vertical/horizontal scale.

   The extent is calculated from the pen width of the backbone,
   the major tick length, the spacing and the maximum width/height
   of the labels.

   \param font Font used for painting the labels
   \return Extent

   \sa minLength()
*/
double QwtScaleDraw::extent( const QFont &font ) const
{
    double d = 0;

    if ( hasComponent( QwtAbstractScaleDraw::Labels ) )
    {
        if ( orientation() == Qt::Vertical )
            d = maxLabelWidth( font );
        else
            d = maxLabelHeight( font );

        if ( d > 0 )
            d += spacing();
    }

    if ( hasComponent( QwtAbstractScaleDraw::Ticks ) )
    {
        d += maxTickLength();
    }

    if ( hasComponent( QwtAbstractScaleDraw::Backbone ) )
    {
        const double pw = qMax( 1, penWidth() );  // pen width can be zero
        d += pw;
    }

    d = qMax( d, minimumExtent() );
    return d;
}

使用:

//具体设置范围依据实际情况约束,我这里50足够了
qplot_place->axisScaleDraw(QwtPlot::yLeft)->setMinimumExtent(50);
qplot_motor->axisScaleDraw(QwtPlot::yLeft)->setMinimumExtent(50);

效果:
约定最小范围后的效果

### 如何设置或调整 QWT坐标轴的范围 在 QWT 库中,`QwtPlot` 类提供了 `setAxisScale()` 函数来设置坐标轴的范围。该函数允许开发者指定某个坐标轴的最大值和最小值以及步长(可选)。以下是具体的方法描述和代码示例。 #### 方法说明 `void QwtPlot::setAxisScale(int axisId, double min, double max, double stepSize = 0);` - **axisId**: 坐标轴 ID,可以是预定义常量之一:`QwtPlot::xBottom`, `QwtPlot::xTop`, `QwtPlot::yLeft`, 或者 `QwtPlot::yRight`[^5]。 - **min**: 轴的最小值。 - **max**: 轴的最大值。 - **stepSize** (可选): 刻度之间的间距大小。如果不提供,则会自动计算合适的刻度间隔。 #### 示例代码 下面是一个简单的代码片段,展示如何使用上述方法设置坐标轴范围: ```cpp #include <qapplication.h> #include <qwt_plot.h> int main(int argc, char* argv[]) { QApplication app(argc, argv); // 创建一个 QwtPlot 对象 QwtPlot plot("Custom Axis Range Example"); // 设置 xBottom 和 yLeft 的坐标轴范围 plot.setAxisScale(QwtPlot::xBottom, 0.0, 100.0); // X 轴范围设为 [0, 100] plot.setAxisScale(QwtPlot::yLeft, -50.0, 50.0); // Y 轴范围设为 [-50, 50] // 显示绘图窗口 plot.resize(800, 600); plot.show(); return app.exec(); } ``` 此代码设置了底部横轴 (`xBottom`) 的范围为 `[0, 100]`,左侧纵轴 (`yLeft`) 的范围为 `[-50, 50]`。 #### 自定义标签与范围结合 如果需要进一步定制坐标轴上的标签内容或者样式,可以通过继承 `QwtScaleDraw` 并重写其虚函数 `label(double value)` 来实现个性化需求[^3]。例如,在某些情况下可能希望将数值转换成特定单位表示形式或其他字符串表达式。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值