Russian Qt Forum
Ноябрь 01, 2024, 10:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Elide текста прозрачностью  (Прочитано 3911 раз)
mutineer
Гость
« : Октябрь 17, 2012, 17:32 »

Привет
Кто-нибудь знает как в QtQuick 1.1 сделать elide текста в элементе Text не троеточием, а увеличением прозрачности букв?
Записан
vregess
Гость
« Ответ #1 : Октябрь 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. Кстати, возможно тут много действий (например можно закешировать создание градиента), может кто увидит и оптимизирует)
Записан
mutineer
Гость
« Ответ #2 : Октябрь 17, 2012, 17:54 »

Что за 25 и 28?
Записан
vregess
Гость
« Ответ #3 : Октябрь 17, 2012, 18:01 »

Что за 25 и 28?

25 - это ширина "эффекта", те ширина маски (высота равна высоте объекта). Выбрано от балды.
А 28 - это запас в 3 пикселя (25 + 3), тк я заметил, что иногда край остается не замаскированным.
rect.height() + 1 по той же причине.
Возможно что-то с системой координат или может я где-то намудрил, но долго думать не стал над этим - брутфорс сэкономил время.
Записан
mutineer
Гость
« Ответ #4 : Октябрь 17, 2012, 18:09 »

Спасибо, что-то я забыл про существование эффектов))
Записан
vregess
Гость
« Ответ #5 : Октябрь 17, 2012, 18:16 »

Не за что. Я тоже поначалу смотрел совсем в другую сторону.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.356 секунд. Запросов: 20.