Russian Qt Forum

Qt => Общие вопросы => Тема начата: bigirbis от Июль 19, 2007, 11:12



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

Qt 4.2.2


Название: Шрифт с окантовкой
Отправлено: Gryz от Июль 19, 2007, 11:21
что если рисовать текст в два слоя - первый красный черный текст, второй - обычный красный.
Только придется повозиться с правильным расположение букв второго слоя.


Название: Шрифт с окантовкой
Отправлено: bigirbis от Июль 19, 2007, 11:30
Вся проблема в том, как сделать этот нижний слой толще, чем верхний. Bold не подходит, т.к. пространство, занимаемое строкой, меняется не так, как этого бы хотелось.


Название: Шрифт с окантовкой
Отправлено: Gryz от Июль 19, 2007, 12:08
а как хотелось ?


Название: Шрифт с окантовкой
Отправлено: bigirbis от Июль 19, 2007, 12:14
Если на примере обычных линий, то так:
- рисуется линия черного цвета толщиной 8 пикселов
- рисуется красная линия толщиной в 4 пиксела.

Но, к сожалению, мне такую штуку не удалось применить для шрифта.


Название: Шрифт с окантовкой
Отправлено: Tonal от Июль 19, 2007, 12:40
В WinAPI эта проблема решается с помощью path-ей.
path - это векторный объект графики.
Из строки создают объект path-а, а потом его обводят и заливают.
Думаю, что какая-то подобная техника должна быть доступна и в Qt.


Название: Шрифт с окантовкой
Отправлено: bigirbis от Июль 19, 2007, 12:48
Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.


Название: Шрифт с окантовкой
Отправлено: -=s0L=- от Июль 19, 2007, 13:33
Цитата: "bigirbis"
Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.


ну это же векторная графика, юзай QMatrix для преобразования, в данном случае надо сделать scale, создать QMatrix и умножить его на QPainterPath, получишь новый Path в соответствии с преобразованием в QMatrix.


Название: Шрифт с окантовкой
Отправлено: Tonal от Июль 19, 2007, 14:11
Цитата: "bigirbis"
Это я уже пробовал. Вопрос в том, каким образом "расширить" QPainterPath, полученный из строки.

Не надо "расширять". Надо залить, а потом обвести.


Название: Шрифт с окантовкой
Отправлено: bigirbis от Июль 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 от Июль 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);
}