Qt概述了没有细化字体的文本

时间:2012-12-20 07:03:10

标签: qt text

我想用Qt4.8绘制轮廓文本,但我也想保留字体的原始形状和可见性。 目前,轮廓隐藏了文本字符,使它们看起来比原件更“薄”。

Qt使用QPen绘制文本字符(和其他形状)的轮廓。 QPen移动到角色的实际边缘并在边线外部绘制内部(请参阅QPen参考中的“连接样式”)。

如果使用较粗的笔,则文本字符看起来更薄,而字符占用的总面积会增加。 换句话说,轮廓侵蚀成文本字符。

我希望文字字符保持原始形状和可见性,同时从轮廓中获得“光环效果”。 即,我只想绘制边线的外部。

使用Qt实现此类效果的最简单方法是什么? 我提出了一些想法,但我想知道是否有可能。

计划A.

用大纲绘制文本,然后绘制相同的文本而不勾勒概述的文本。

不幸的是,QTextCursor不支持“透支”或“过度打字”,您可以使用经典打字机。 也会有性能损失。

B计划。

修改Qt库,使其先用QPen绘制轮廓,然后用QBrush填充内部。 QBrush会画出轮廓的内侧部分,只留下完整的外部。

我不确定它是否有效,我想尽可能避免修改Qt库。

计划C。

暂时将用于绘制文本的QPainter的“CompositionMode”切换为“QPainter :: CompositionMode_DestinationOver”。

为此,我认为我需要控制Qt的文本操作小部件(如QTextBrowser)创建和使用的私有和临时QPainter,但我不知道如何完成。

我是Qt编程的新手,我在X窗口上使用Qt 4.8.2。

您可以通过将以下代码行(第156-164行)添加到/usr/lib64/qt4/examples/richtext/calendar/mainwindow.cpp,编译并运行它,并将字体大小增加到40来查看我的问题或更大。

 QTextCharFormat format = cursor.charFormat();
 format.setFontPointSize(fontSize);

 QTextCharFormat boldFormat = format;
 boldFormat.setFontWeight(QFont::Bold);

 // Additional code lines for green outline : line 156
 QPen    pen;
 pen.setStyle(Qt::SolidLine);
 pen.setWidthF(4);
 pen.setBrush(Qt::green);
 pen.setCapStyle(Qt::RoundCap);
 pen.setJoinStyle(Qt::RoundJoin);
 boldFormat.setTextOutline(pen);
 // The end of the additional code : line 164

如果你能告诉我如何前往并给我最初的线索,我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我找到了一种方法,如何对QGraphicsView文本对象进行此类概述。我认为,您可以将它用于基于QTextDocument(例如QTextEdit)的任何类。我已根据QGraphicsTextItem创建了一个类,并重新实现了其paint函数:

void paint (QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{ QTextCharFormat format;
  format.setTextOutline (QPen (Qt::white, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); // Color and width of outline
  QTextCursor cursor (this->document());
  cursor.select (QTextCursor::Document);
  cursor.mergeCharFormat (format);
  QGraphicsTextItem::paint (painter, option, widget);
  format.setTextOutline (QPen (Qt::transparent));
  cursor.mergeCharFormat (format);
  QGraphicsTextItem::paint (painter, option, widget);
}

我注意到这个解决方案的唯一错误 - 当您编辑文本并开始选择一些字母时,会发生剪切。但这几乎是不明显的。对于不可编辑的项目,我找不到任何错误。

但是如果你想概述QPushButton文本(例如),那么它很简单(已经多次讨论过这个问题) - 内部重新实现paintEvent创建QPainterPath,调用{ {1}},然后使用path.addTextpainter.strokePath - painter.fillPath创建大纲,strokePath填充前景。