- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 Qt4.8 绘制轮廓文本,但我也想保持字体的原始形状和可见性。
目前,轮廓隐藏了文本字符,让它们看起来比原始字符“更薄”。
Qt 使用 QPen 绘制文本字符(和其他形状)的轮廓。
QPen 在字符的实际边缘移动并在外部绘制和 里面 边缘线(参见 QPen 引用中的“连接样式”)。
如果您使用较粗的笔,则文本字符看起来更细,而轮廓所占用的字符总面积会增加。
换句话说,轮廓侵 eclipse 到文本字符中。
我想让文本字符保持其原始形状和可见性,同时从轮廓中获得“光环效果”。
即,我只想绘制边缘线的外侧。
用 Qt 实现这种效果的最简单方法是什么?
我想出了一些想法,但我想知道它们中的任何一个是否可能。
计划 A。
绘制带轮廓的文本,然后在轮廓上绘制相同的没有轮廓的文本。
不幸的是,QTextCursor 不支持“过度绘制”或“过度打字”,您可以使用经典打字机来做到这一点。
也会有性能损失。
B计划。
修改 Qt 库,使其先用 QPen 绘制轮廓,然后用 QBrush 填充内部。 QBrush 会在轮廓的内侧部分进行绘制,而只保留外侧完整的部分。
我不确定它是否有效,如果可能的话,我想避免修改 Qt 库。
C计划。
将用于绘制文本的 QPainter 的“CompositionMode”暂时切换为“QPainter::CompositionMode_DestinationOver”。
为此,我认为我需要控制 Qt 的文本操作小部件(如 QTextBrowser)创建和使用的私有(private)和临时 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
最佳答案
我找到了一种方法,如何为 QGraphicsView
做这样的概述文本对象。我认为,您可以将它用于任何基于 QTextDocument
的类(class)(例如 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
, 调用
path.addText
,然后使用
painter.strokePath
,
painter.fillPath
-
strokePath
创建轮廓,
fillPath
填充前景。
关于没有细化字体的 Qt 轮廓文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966868/
我正在尝试缩小此图像,但它会不断失真。 这是我应用细化的相关代码。我也尝试过使用“thin”功能而不是“skeletonize”,但结果相似。 from skimage.morphology impo
好的,据我所知,目前我们有两种方法 首先是我可以在给定脚本中使用的一些 javascript。但这会关闭所有内容的右键单击。 window.oncontextmenu = function() {
在 MarkLogic 中如何找到元素所在的文档 URI 匹配的值为1742 这里是示例 XML 文档: 1742 1742 TT 1742
摘要:我有一个数据集,其收集方式使得维度最初不可用。我想获取本质上是一大块无差别的数据,并为其添加维度,以便可以对其进行查询、子集化等。这是以下问题的核心。 这是我拥有的 xarray 数据集: D
我有一个大型数据集(请参阅下面的示例格式),我需要进行以下思考: 确定第 1、2、5 列中出现的重复值 - 如果全部重复,那么我需要删除多余的行并对第 8 列中的值进行平均(这对于我将发布的代码是成功
我正在做一个练习项目,其中 iOS 应用程序打印来自 jsonplaceholder.typicode.com 的/posts 列表,当用户选择一个时,加载详细 View Controller 并显示
module Access def last self[-1] end def start_end self[0] + last end end module Stri
我是一名优秀的程序员,十分优秀!