Russian Qt Forum

Qt => Qt Quick => Тема начата: mutineer от Октябрь 17, 2012, 17:32



Название: Elide текста прозрачностью
Отправлено: mutineer от Октябрь 17, 2012, 17:32
Привет
Кто-нибудь знает как в QtQuick 1.1 сделать elide текста в элементе Text не троеточием, а увеличением прозрачности букв?


Название: Re: Elide текста прозрачностью
Отправлено: vregess от Октябрь 17, 2012, 17:50
Если не найдешь, как в QtQuick, то вот как я делал на с++: свой QGraphicsEffect, вот реализация метода draw():
Код
C++ (Qt)
void ViewportElideEffect::draw(QPainter *painter)
{
   if (!m_view->isElide(Qt::AlignRight))
   {
       drawSource(painter);
       return;
   }
 
   QPoint offset;
   QPixmap pixmap = sourcePixmap(
       Qt::DeviceCoordinates,
       &offset,
       QGraphicsEffect::NoPad);
 
 
   QRectF rect = m_view->boundingRect();
   rect.moveTo(rect.width() - 25, 0);
   rect.setWidth(28); //### hack to fix not fully filled part (sometimes)
   rect.setHeight(rect.height() + 1);
 
   QLinearGradient g(rect.topLeft(), rect.topRight());
   g.setColorAt(0, Qt::black);
   g.setColorAt(0.8, Qt::transparent);
 
   QTransform worldTransform = painter->worldTransform();
   worldTransform *= QTransform::fromTranslate(-offset.x(), -offset.y());
 
   QPainter pixmapPainter(&pixmap);
   pixmapPainter.setRenderHints(painter->renderHints());
   pixmapPainter.setWorldTransform(worldTransform);
   pixmapPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
   pixmapPainter.fillRect(rect, QBrush(g));
 
   painter->setWorldTransform(QTransform());
   painter->drawPixmap(offset, pixmap);
}
 

Здесь m_view - это объект, на который наложен эффект; те эффект жестко привязан к определенному классу, если чуть подправить, то можно сделать для общего случая.

P.S. Кстати, возможно тут много действий (например можно закешировать создание градиента), может кто увидит и оптимизирует)


Название: Re: Elide текста прозрачностью
Отправлено: mutineer от Октябрь 17, 2012, 17:54
Что за 25 и 28?


Название: Re: Elide текста прозрачностью
Отправлено: vregess от Октябрь 17, 2012, 18:01
Что за 25 и 28?

25 - это ширина "эффекта", те ширина маски (высота равна высоте объекта). Выбрано от балды.
А 28 - это запас в 3 пикселя (25 + 3), тк я заметил, что иногда край остается не замаскированным.
rect.height() + 1 по той же причине.
Возможно что-то с системой координат или может я где-то намудрил, но долго думать не стал над этим - брутфорс сэкономил время.


Название: Re: Elide текста прозрачностью
Отправлено: mutineer от Октябрь 17, 2012, 18:09
Спасибо, что-то я забыл про существование эффектов))


Название: Re: Elide текста прозрачностью
Отправлено: vregess от Октябрь 17, 2012, 18:16
Не за что. Я тоже поначалу смотрел совсем в другую сторону.