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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как сделать подложку текста ?  (Прочитано 11445 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Апрель 05, 2013, 13:39 »

Нужно сделать подложку текста на подобии такой http://joxi.ru/mKReUdg5CbAROKsVLzI. Собственно вопрос как ? Улыбающийся В идеале такой текст сделать в QTextEdit, но как я понял это не реально )))) пробовал и html текст для этого задавать, но видимо css там на таком уровне не поддерживается. Затем решил написать свой QGraphicsItem у него переопределить paint и там выводить текст, но что то с помощью QPainter не удалось сделать такую подложку, видимо не хватает каких то навыков. И последнее что я испробовал это QGraphicsDropShadowEffect, он может сделать тень, но у него не получается сделать именно подложку вокруг всего текста. Есть у кого нибудь идеи ?
Записан
_OLEGator_
Гость
« Ответ #1 : Апрель 05, 2013, 13:45 »

Текст рисуется два раза.
1) Увеличенный в размере белым.
2) Нормальный размер красным.
Или требуется что-то еще?

UPD.
Ну и маленькая тень снизу рисуется на 0 этапе, небольшим сдвигом вниз увеличенного текста, серым/темно-серым.
« Последнее редактирование: Апрель 05, 2013, 13:48 от _OLEGator_ » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Апрель 05, 2013, 13:51 »

Как раз так и пробовал, у меня получилось так что при рисовании текста что больше по размеру, увеличивается все пропорционально, в том числе и расстояние между буквами. Стало быть текст что меньше просто не попадает в нужную позицию в центре. размеры текста пробовал менять и с помощью font и с помощью QTransform::scale()
Записан
_OLEGator_
Гость
« Ответ #3 : Апрель 05, 2013, 14:03 »

А, ну да. Так не прокатит. Это работает только на небольших обводках.
Здесь потребуется что-то более хитрое.
А просто отрисовка текста с кистью нужной толщины не дает необходимого эффекта? Тоесть когда и заливка и кисть установлена QPainter'у.
« Последнее редактирование: Апрель 05, 2013, 14:06 от _OLEGator_ » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #4 : Апрель 05, 2013, 14:04 »

вот и я о том же Улыбающийся Сейчас пробую понять как это в qml делается у элемента Text так там, они текст выводят просто через QPixmap и рисуют по сути два пиксмапа для вывода такого стиля текста. Но как они формируют их пока понять не могу.
Записан
Bepec
Гость
« Ответ #5 : Апрель 05, 2013, 14:07 »

Я думаю там делается проще - каждая буква отрисовывается отдельно.

Рисуем большую, поверх маленькую. Отрисовываем. Отступаем на положенные пиксели и делаем дальше. Конечно алгоритм топорный, но, думаю, поплывёт.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Апрель 05, 2013, 14:15 »

И последнее что я испробовал это QGraphicsDropShadowEffect, он может сделать тень, но у него не получается сделать именно подложку вокруг всего текста. Есть у кого нибудь идеи ?
Код
C++ (Qt)
QGraphicsDropShadowEffect::setOffset( 0, 0 );
QGraphicsDropShadowEffect::setBlurRadius( 20 );
 
но край тени будет размытым.
Записан

Qt 5.11/4.8.7 (X11/Win)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Апрель 05, 2013, 14:46 »

Насчет рисовать каждую букву думается не очень хорошая идея, скажется на производительности достаточно сильно. А насчет QGraphicsDropShadowEffect, пробовал с такими же параметрами, тени не было вообще, хотя может что то не то задал.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Апрель 05, 2013, 14:59 »

можно проще:
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #9 : Апрель 05, 2013, 15:04 »

Гениально. В очередной раз поражаюсь как люди на форуме умудряются дать полный, обоснованный и понятный любому (не понимающему в программировании) человеку ответ, содержащий максимум информации о проблеме и способах её решения.

PS а как всё просто то!
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Апрель 05, 2013, 15:15 »

Гениально. В очередной раз поражаюсь как люди на форуме умудряются дать полный, обоснованный и понятный любому (не понимающему в программировании) человеку ответ, содержащий максимум информации о проблеме и способах её решения.

PS а как всё просто то!

1372 года я постигал это священное знание у тибетских монахов)
Не зря значит)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #11 : Апрель 05, 2013, 15:22 »

m_ax, не совсем понимаю как ты это сделал Улыбающийся из исходников qml получился вот такой пример

Код:
    QFont font;
    font.setPixelSize(24);
    font.setFamily("Arial");


    int offset = 2;

    QString text = "This is test text";
    QFontMetrics fm(font);

    QPixmap styleSource(fm.width(text),fm.height());
    styleSource.fill(Qt::transparent);
    QPainter paint(&styleSource);
    paint.setPen(Qt::white);
    paint.setBrush(Qt::white);
    paint.setFont(font);
    paint.drawText(1,fm.height(),text);
    paint.end();

    QPixmap source(fm.width(text),fm.height());
    source.fill(Qt::transparent);
    QPainter paint2(&source);
    paint2.setPen(Qt::red);
    paint2.setBrush(Qt::red);
    paint2.setFont(font);
    paint2.drawText(1,fm.height(),text);
    paint2.end();


    QPixmap img = QPixmap(styleSource.width() + offset * 2, styleSource.height() + offset * 2);
    img.fill(Qt::transparent);

    QPainter ppm(&img);

    QPoint pos(0, 0);
    pos += QPoint(-offset, 0);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(offset * 2, 0);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(-offset, -offset);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(0, offset * 2);
    ppm.drawPixmap(pos, styleSource);

    pos += QPoint(0, -offset);
    ppm.drawPixmap(pos, source);
    ppm.end();


    painter->drawPixmap(0,0,img);

вроде работает не плохо, но удовольствия не много по несколько раз рисовать текст. m_ax расскажи как ты сделал ?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Апрель 05, 2013, 15:26 »

m_ax, не совсем понимаю как ты это сделал Улыбающийся из исходников qml получился вот такой пример

Код:
    QFont font;
    font.setPixelSize(24);
    font.setFamily("Arial");


    int offset = 2;

    QString text = "This is test text";
    QFontMetrics fm(font);

    QPixmap styleSource(fm.width(text),fm.height());
    styleSource.fill(Qt::transparent);
    QPainter paint(&styleSource);
    paint.setPen(Qt::white);
    paint.setBrush(Qt::white);
    paint.setFont(font);
    paint.drawText(1,fm.height(),text);
    paint.end();

    QPixmap source(fm.width(text),fm.height());
    source.fill(Qt::transparent);
    QPainter paint2(&source);
    paint2.setPen(Qt::red);
    paint2.setBrush(Qt::red);
    paint2.setFont(font);
    paint2.drawText(1,fm.height(),text);
    paint2.end();


    QPixmap img = QPixmap(styleSource.width() + offset * 2, styleSource.height() + offset * 2);
    img.fill(Qt::transparent);

    QPainter ppm(&img);

    QPoint pos(0, 0);
    pos += QPoint(-offset, 0);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(offset * 2, 0);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(-offset, -offset);
    ppm.drawPixmap(pos, styleSource);
    pos += QPoint(0, offset * 2);
    ppm.drawPixmap(pos, styleSource);

    pos += QPoint(0, -offset);
    ppm.drawPixmap(pos, source);
    ppm.end();


    painter->drawPixmap(0,0,img);

вроде работает не плохо, но удовольствия не много по несколько раз рисовать текст. m_ax расскажи как ты сделал ?

Да вообщем то, так же и делал.. Сначала фон рисуется со смещением (вверх, вниз, вправо, влево) затем на него по центру рисуется итоговый текст. Можно свой виджет сделать, из QLabel'ов, тогда ещё поддержка html будет.
Я бы веджет свой написал..  
« Последнее редактирование: Апрель 05, 2013, 15:27 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #13 : Апрель 05, 2013, 15:30 »

По любому придется писать, ибо еще должна быть возможность редактировать текст.
Записан
_OLEGator_
Гость
« Ответ #14 : Апрель 05, 2013, 15:34 »

Повторю свой вопрос, на который не ответили:
А просто отрисовка текста с кистью нужной толщины не дает необходимого эффекта? Тоесть когда и заливка и кисть установлена QPainter'у.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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