我正在使用QPainter在QImage上绘制多行文本。但是,我还需要在每个字符的边框周围显示一个彩色矩形。
因此,我需要知道每个字符在绘制时所具有的边界框。
例如,对于
painter.drawText(QRect(100, 100, 200, 200), Qt::TextWordWrap, "line\nline2", &r);
考虑到换行符,自动换行,制表符等,我将需要获得10个矩形。
例如,由于换行,第二个
'l'
的矩形将在第一个'l'
的矩形下方,而不是在'e'
的右侧。就像这张图片中红色矩形的坐标一样(我将它们手动放置,因此它们并不是真正的正确位置):
最佳答案
这可能不是最佳解决方案,但我可以想到的是最佳解决方案。
我相信您将必须“自己动手”。也就是说,不是绘制文本块,而是一次绘制每个字符。然后,您可以使用QFontMetrics来获取每个字符的边界框。
这是一个小工作,但还算不错。类似于(伪代码,而不是代码)的东西:
QFontMetrics fm(myFont, paintDevice);
int x = startX;
int y = startY;
for (unsigned int i = 0; i < numChars; i++)
{
char myChar = mystr[i]; // get character to print/bound
QRect rect = fm.boundingRect( myChar ); // get that char's bounding box
painter.drawText(x, y, Qt::TextWordWrap, mystr[i], &r); // output char
painter.drawRect(...); // draw char's bounding box using 'rect'
x += rect.width(); // advance current position horizontally
// TODO:
// if y > lineLen // handle cr
// x = startX;
// y += line height
}
看看QFontMetrics,它有很多不同的方法来获取边界框,最小边界框等。
QFontMetrics 4.7
嗯...我现在看到您正在使用的重载返回实际的边界rect。您可以只使用它,并根据需要跳过QFontMetrics-否则整个算法是相同的。
关于c++ - QPainter::drawText,获取每个字符的边框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13364231/