我想用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
Run Code Online (Sandbox Code Playgroud)
如果你能告诉我要走的路并给我最初的线索,我将非常感谢你的帮助.
我找到了一种方法,如何为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);
}
Run Code Online (Sandbox Code Playgroud)
我注意到这个解决方案的唯一错误 - 当您编辑文本并开始选择一些字母时,会发生剪切。但这几乎是不可察觉的。对于不可编辑的项目,我找不到任何错误。
但是,如果您想要概述QPushButton文本(例如),那么它是微不足道的(这个问题已经讨论过很多次) - 在内部重新实现paintEventcreate QPainterPath, call path.addText,然后使用painter.strokePath, painter.fillPath-strokePath创建轮廓,并fillPath填充前景。
| 归档时间: |
|
| 查看次数: |
6289 次 |
| 最近记录: |