如果渲染的QString
s
超過rect.width()
,我想繪製褪色文字(向右)。目前我做的:右褪色文字優化
inline void drawFadedLineText(QPainter* const painter, QRectF const& rect,
QColor const& color, QString const& s)
{
painter->setPen(color);
auto const fontMetrics(painter->fontMetrics());
if (fontMetrics.width(s) > rect.width())
{
QPixmap pixmap(rect.size().toSize());
pixmap.fill(Qt::transparent);
{
QPainter p(&pixmap);
p.setFont(painter->font());
p.drawText(0, fontMetrics.ascent(), s);
static QLinearGradient lg;
static bool init;
if (!init)
{
init = true;
lg.setStops(QGradientStops{
qMakePair(qreal(0), QColor(0, 0, 0, 238)),
qMakePair(qreal(1), QColor(0, 0, 0, 17))});
}
// else do nothing
static auto const margin(qreal(10));
auto const right(rect.width());
lg.setStart(right - margin, qreal(0));
lg.setFinalStop(right, qreal(0));
p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
p.fillRect(QRectF(right - margin, 0, margin, rect.height()), lg);
}
painter->drawPixmap(rect.topLeft(), pixmap);
}
else
{
painter->drawText(QPointF(rect.left(),
rect.top() + fontMetrics.ascent()), s);
}
}
這種方法的問題是,需要一個額外層(QPixmap
),但我不能使用的組成模式DestinationIn
與文本直接作爲畫家可能已經被一些背景所吸引,並且隨着文本的消逝,文本也會隨之消失。有沒有更好的方法?
這種方法沒有意義。與函數調用開銷相比,您在內部調用需要相當長的時間。除非您有測量結果顯示它改善了事情,否則不要內聯。 –