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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Шрифт с окантовкой  (Прочитано 12228 раз)
bigirbis
Гость
« : Июль 19, 2007, 11:12 »

Есть такая задача: в paintEvent() нарисовать строку, каждая буква, которой будет иметь окантовку. Т.е. сама буква красная, а края линий у нее черные. Не могу осилить, с какой стороны подойти.
Кто-нибудь решал подобную задачу?

Qt 4.2.2
Записан
Gryz
Гость
« Ответ #1 : Июль 19, 2007, 11:21 »

что если рисовать текст в два слоя - первый красный черный текст, второй - обычный красный.
Только придется повозиться с правильным расположение букв второго слоя.
Записан
bigirbis
Гость
« Ответ #2 : Июль 19, 2007, 11:30 »

Вся проблема в том, как сделать этот нижний слой толще, чем верхний. Bold не подходит, т.к. пространство, занимаемое строкой, меняется не так, как этого бы хотелось.
Записан
Gryz
Гость
« Ответ #3 : Июль 19, 2007, 12:08 »

а как хотелось ?
Записан
bigirbis
Гость
« Ответ #4 : Июль 19, 2007, 12:14 »

Если на примере обычных линий, то так:
- рисуется линия черного цвета толщиной 8 пикселов
- рисуется красная линия толщиной в 4 пиксела.

Но, к сожалению, мне такую штуку не удалось применить для шрифта.
Записан
Tonal
Гость
« Ответ #5 : Июль 19, 2007, 12:40 »

В WinAPI эта проблема решается с помощью path-ей.
path - это векторный объект графики.
Из строки создают объект path-а, а потом его обводят и заливают.
Думаю, что какая-то подобная техника должна быть доступна и в Qt.
Записан
bigirbis
Гость
« Ответ #6 : Июль 19, 2007, 12:48 »

Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.
Записан
-=s0L=-
Гость
« Ответ #7 : Июль 19, 2007, 13:33 »

Цитата: "bigirbis"
Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.


ну это же векторная графика, юзай QMatrix для преобразования, в данном случае надо сделать scale, создать QMatrix и умножить его на QPainterPath, получишь новый Path в соответствии с преобразованием в QMatrix.
Записан
Tonal
Гость
« Ответ #8 : Июль 19, 2007, 14:11 »

Цитата: "bigirbis"
Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.

Не надо "расширять". Надо залить, а потом обвести.
Записан
bigirbis
Гость
« Ответ #9 : Июль 19, 2007, 14:32 »

Короче так:

Код:
QPainter p( this );
QPainterPath pPath;
pPath.addText( QFontMetrics( font() ).boundingRect( fillRect_, Qt::AlignCenter, text_ ).bottomLeft(), font(), text_ );
int penSize;
if( font().pointSize() < 5 ) penSize = 0;
else penSize = qMax( penSize = font().pointSize() / 10, 1 );
p.setPen( QPen( Qt::black, penSize ) );
p.setBrush( Qt::red );
p.drawPath( pPath );


Жаль, что сразу не догадался. :oops:
Всем спасибо за беспокойство.

Тема закрыта
Записан
Anchorite
Гость
« Ответ #10 : Июль 19, 2007, 14:44 »

Такой эффект с текстом можно сделать довольно просто. Пример кода правда на Яве, но думаю разобраться можно Подмигивающий

Код:

public static void drawBorderedString(Graphics g,
 String outString,
 int x, int y,
 int anchor,
 int color, int borderColor)
{
g.setColor(borderColor);

for(int shiftY = -1; shiftY <= 1; shiftY++) {
for(int shiftX = -1; shiftX <= 1; shiftX++) {
g.drawString(outString, x + shiftX, y + shiftY, anchor);
}
}

g.setColor(color);
g.drawString(outString, x, y, anchor);
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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