以下代码围绕QPainterPath
绘制文本:
QString text = "Short text";
QPainterPath rawPath;
// fill path ...
while (...)
{
double percent = ...;
double angle = rawPath.angleAtPercent(percent);
QPointF point = rawPath.pointAtPercent(percent);
m_painter.save();
m_painter.translate(point);
m_painter.rotate(-angle);
// Version 1:
//m_painter.drawText(0, 0, text.at(currentChar));
// Version 2:
QPainterPath p2;
p2.addText(0, 0, font, text.at(currentChar));
m_painter.drawPath(p2);
m_painter.restore();
}
图形结果符合预期,但版本1和版本2的性能都很差。瓶颈是QPainter::drawText()
和QPainterPath::addText()
方法。是否有更有效的方法在路径周围绘制文本?
问候,
没有内置方法在路径后绘制文本。
但是,如果QPainter
效率不高,你可以通过在文本中构建一个新路径并在循环后绘制来获得一些性能(你不会在循环中使用QPainter::save()
和QPainter::restore()
):
void paintEvent(QPaintEvent* event)
{
QString text = "Short text";
text = text.repeated(1000); // Check with a very long text
QPainterPath rawPath;
rawPath.addEllipse(QRect(0, 0, 200, 200));
QPainterPath path;
double const step = 1.0 / double(text.length());
double percent = 0.0;
for(QChar const& c: text)
{
double angle = rawPath.angleAtPercent(percent);
QPointF point = rawPath.pointAtPercent(percent);
QTransform mat;
mat.rotate(-angle);
QPainterPath p2;
p2.addText(0, 0, font(), c);
p2 = mat.map(p2);
path.addPath(p2.translated(point));
percent += step;
}
QPainter painter(this);
painter.drawPath(path.translated(100, 100));
}