在绘制多个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宽度设置后的效果图:
版权声明:本文为博主原创文章,转载请附上博文链接!