QPainter 绘制文本,显示不全的问题
使用QPainter
的drawText
函数,绘制文本,drawText
函数有很多重载版本,
此处主要介绍415行和420以及423行的三个函数
inline void drawText(int x, int y, const QString &s);
void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
使用第一个函数inline void drawText(int x, int y, const QString &s);
绘制文本时,前面的参数 x, y
为文本基线(baseline)
的位置,如果不懂基线
,可以参考一下此文章跳转
重点介绍一下第二个函数void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
其中第一个参数const QRect &r
指的是文本的矩形区域,很多同学计算文本宽度时,使用的QFontMetrics
类的width
函数或者boundingRect().width
函数
width
函数和boundingRect().width
确实都可以计算文本的宽度,具体的差别,可以在帮助文档中查看,一般来讲, width
函数计算出来的数值,会比boundingRect().width
计算出来的数值要稍微大一点,很多同学就是使用 boundingRect().width
计算出文本宽度,然后使用drawText
方法绘制文本,例如:painter.drawText(QRect(100, 100, boundingRect(text).width, height), text);
,结果发现文本显示不全;
可以发现,以上的drawText
其实是调用的第三个函数,且没有传递第三个参数;其实boundingRect().width
计算出来的文本宽度是正确的,只是我们不能这样调用drawText
函数来绘制,我们应该指定水平对齐方式
,
例如调用第二个函数: painter.drawText(QRect(100, 100, boundingRect(text).width, height), Qt::AlignLeft, text);
这样就能绘制正常了;这里的水平对齐方式,无论是水平居中,水平居左,还是水平居右都可以
放一个例子,演示drawText
显示不全的现象
个人建议,保险起见还是使用width
函数计算文本宽度,然后再使用第二个函数绘制文本,并指定文本的对齐方式