[PATCH] Profile: add white outline to all text

Lubomir I. Ivanov neolit123 at gmail.com
Fri Jun 28 06:36:16 PDT 2013

From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

Goal: no blending between profile text and graph lines

Qt doesn't seem to provide an easy-to-go solution in terms
of styling the z-order of the pen and brush layers of a
QAbstractGraphicsShapeItem (or alternatively pen offset),
which is needed if for example one likes the pen not
to cover the text fill.

Calling QGraphicsSimpleTextItem->setPen() on small text can
cover bigger portions of the text, as the pen ends on top of the
fill and given the pen stroke path ends up scaling exactly
at the fill path border but not on the outside, for example.

Since we don't get quick control over that (and to avoid
the issue in a naive way), we set the text as bold
and the white outline lands over the "bold-ed" area of glyphs.

i still think that QPainterPathStroker, QGraphicsPathItem and QPainter
can be used for that, but it will probably end up being more expensive
and perhaps not really worth it.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
 qt-ui/profilegraphics.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index cb69bc1..f04d2d1 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -1135,16 +1135,20 @@ void ProfileGraphicsView::plot_depth_profile()
 QGraphicsSimpleTextItem *ProfileGraphicsView::plot_text(text_render_options_t *tro,const QPointF& pos, const QString& text, QGraphicsItem *parent)
-	QFontMetrics fm(font());
+	QFont fnt(font());
+	fnt.setBold(true);
+	QFontMetrics fm(fnt);
 	double dx = tro->hpos * (fm.width(text));
 	double dy = tro->vpos * (fm.height());
 	QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem(text, parent);
+	item->setFont(fnt);
 	QPointF point(SCALEGC(pos.x(), pos.y())); // This is neded because of the SCALE macro.
 	item->setPos(point.x() + dx, point.y() + dy);
+	item->setPen(QPen(profile_color[TEXT_BACKGROUND].first()));
 	if (!parent)

More information about the subsurface mailing list