【问题标题】:QSvgRenderer boundsOnElement() always returns size 0,0 for text elementsQSvgRenderer boundsOnElement() 总是为文本元素返回大小 0,0
【发布时间】:2016-04-21 03:14:08
【问题描述】:

我在使用 QSvgRenderer 和文本元素时遇到了一些问题;每次调用 boundsOnElement() 时,我都会返回一个正确对应于文本元素左上角的 QRect(当然是在应用 matrixForElement() 之后),但它的宽度和高度始终为零。

我正在使用 PySide,因此可能是某些未实现的 Python 层有问题,但 poor support of SVG text in Qt and elsewhere 让我不这么认为。有没有人:

  • 直接使用 Qt 体验过,

而且,更重要的是:

  • 知道如何在 Qt 中获取 SVG 文本元素的大小吗?

我正在考虑尝试根据字体大小、字符串长度等手动猜测,但这似乎很容易出错,如果可以的话,我想正确地做。如果有人有任何排版经验,如果我必须破解这个问题,我需要考虑的事情当然是受欢迎的。

【问题讨论】:

  • 为了后代,我最终使用了等宽字体,截取屏幕截图,手动测量字母的宽度,然后将该宽度乘以字符串的长度。这显然不是最好的方法,但它至少有效。不过,我不是快递的忠实粉丝,所以仍然欢迎回答/cmets。
  • 我认为你遇到了这个错误:bugreports.qt-project.org/browse/QTBUG-2002

标签: qt svg pyside typesetting


【解决方案1】:

我也遇到过这个错误。一种替代方法是使用QFontMetrics 类。 (或QFontMetricsF 类)

例子:

QSvgGenerator svg;
QFont font("Arial", 12);
QFontMetricsF metrics(font, &svg);

QString text = "My SVG String";
QRectF bounds = metrics.boundingRect(text);

这将返回非零边界。但是,根据我的经验,虽然此例程将返回准确的原点和高度信息,但宽度通常比应有的长。您的文本字符串越长,此边界框末尾的“填充”就越多。如果有人对那个错误有解决方案,请告诉我。

更新:这个尺寸错误是特定字体所独有的。例如:Times New Roman 似乎计算得非常准确,而其他字体可能计算得太短或太长。这似乎意味着 Qt 正在使用的算法忽略了某些字体中的特定特征。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多