【发布时间】:2013-06-05 07:33:09
【问题描述】:
如果渲染的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 与文本,因为画家可能已经用一些背景和淡化文本也会随之淡化。有没有更好的办法?
【问题讨论】:
-
inline这个方法毫无意义。与函数调用开销相比,您在其中进行的调用将花费相当长的时间。除非您有测量结果表明它可以改善事情,否则不要内联。
标签: c++ qt optimization