多个QCustomPlot图表,实现纵坐标TickLabel宽度对齐

在多图表比较时,由于纵坐标数据字符串长度不一导致刻度标签对齐问题。解决方法是计算所有图表的最大数据字符串长度,并通过自定义QCPAxis的setTickLabelMinWidth函数设置最小宽度,确保所有图表的纵坐标标签在同一垂直线上。

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

在绘制多个QCustomPlot图表时,由于每个图表的纵坐标数据不同,从而导致纵坐标不在同一垂直线上,不便于多个图表统一观察,解决办法如下:

首先确定绘制纵坐标数据的字符串长度,如:

QString str_1 = “410.14”;
int length_1 = str_2 .length(); //length_1 = 6;

QString str_2 = “-123.41”;
int length_2 = str_2 .length(); //length_2 = 7;

str_1为图表1中的数据字符串,则通过循环找出图表1中绘制数据的最大字符串长度length_Max_1;同理,找出其他图表中最大字符串长度length_Max_2、length_Max_3、length_Max_4...等;

QVector<Qvector<QString>> data;
QVector<QCustomPlot*> customPlot;
int length_max = 0, length = 0;

if(customPlot.size() != data.size())
{
    return;
}
for (int i = 0; i < customPlot.size(); i++)
{
    for (int j = 0; j < data.size(); j++)
    {
        length = qMax(length, data[j].length());
    }
    length_max = qMax(length_max, length);
    length = 0;
}

再利用qMax,找出length_Max_1、length_Max_2、length_Max_3、length_Max_4...等中做大值length_Max。

由于QCustomPlot本身纵坐标TickLabel默认为自适应,因此需要新定义设置TickLabel最大宽度的函数setTickLabelMinWidth;

int tickLabelMinWidth = 0;

void QCPAxis::setTickLabelMinWidth(int width)
{
	mTickLabelMinWidth = width;
}
void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString &text,  QSize *tickLabelsSize) const
{
  // note: this function must return the same tick label sizes as the placeTickLabel function.
  QSize finalSize;
  if (mParentPlot->plottingHints().testFlag(QCP::phCacheLabels) && mLabelCache.contains(text)) // label caching enabled and have cached label
  {
    const CachedLabel *cachedLabel = mLabelCache.object(text);
    finalSize = cachedLabel->pixmap.size()/mParentPlot->bufferDevicePixelRatio();
  } else // label caching disabled or no label with this text cached:
  {
    TickLabelData labelData = getTickLabelData(font, text);
    finalSize = labelData.rotatedTotalBounds.size();
  }
  
  // expand passed tickLabelsSize if current tick label is larger:
  if (finalSize.width() > tickLabelsSize->width())
    tickLabelsSize->setWidth(finalSize.width());

    //当tickLabelMinWidth>=0时,设置tickLabel的宽度
  if (tickLabelMinWidth >= 0)
  {
	  tickLabelsSize->setWidth(tickLabelMinWidth * 8);
  }
  if (finalSize.height() > tickLabelsSize->height())
    tickLabelsSize->setHeight(finalSize.height());

  
}

tickLabel宽度设置前的效果图:

tickLabel宽度设置后的效果图:

 版权声明:本文为博主原创文章,转载请附上博文链接!

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值