• 5813阅读
  • 2回复

[提问]QPainter能否绘制简单的镶边文字? [复制链接]

上一主题 下一主题
离线xuang
 

只看楼主 倒序阅读 楼主  发表于: 2015-09-16
QPainter的drawText方法能否绘制镶边效果的文字?
我查了一下Assistant,貌似QTextFormat类能够做到文字镶边的效果,但是不知道怎么把它和drawText用到一起去。
镶边不用很复杂,只需要一个像素宽的黑色就行,为的是能够在不同颜色的背景下都能看清文字内容。
效果就像下面这张图显示的一样:

离线彩阳

只看该作者 1楼 发表于: 2015-09-17
是可以实现的,看看Qt的例子:painterpath。
里面设置了一下这个QPen,然后结合QPainterPath::addText()函数。
上海Qt开发联盟,热忱地欢迎你的加入!
离线xuang

只看该作者 2楼 发表于: 2016-09-08

使用QPainterPath::addText()的确可以实现文字黑边的的效果,但是对于小字体(基本上只有一个像素宽的文字)实现效果并不理想,无论是调节字体的粗细,还是减小边线的宽度,最后得到的效果总是很不自然:



最近发现了一个笨办法能够达到这种小字体增加黑边的效果:先使用黑色的相同字体在预定绘制文字的位置处分别向四周偏移一个像素绘制黑色文字,然后再用文字颜色绘制文字:

  1. painter.save();
  2. painter.setPen(QPen(Qt::black, 1));
  3. painter.setBrush(Qt::NoBrush);
  4. int offset_x[8] = { -1, 0, 1, 1, 1, 0, -1, -1 };
  5. int offset_y[8] = { -1, -1, -1, 0, 1, 1, 1, 0 };
  6. for (int i = 0; i < 8; ++i)
  7. {
  8.     QRectF r = rect; // 预定绘制文字的Rectangle
  9.     r.moveCenter(r.center() + QPointF(offset_x[i], offset_y[i]));
  10.     painter.drawText(r, flag, text);
  11. }
  12. painter.restore();
  13. painter.drawText(rect, flag, text);

这个办法的效率可能有些低,但是效果还是比较好的。
快速回复
限100 字节
 
上一个 下一个