crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Высота шрифта ?, Проблемы с QFontMetrics и т.п.
ViGOur
  опции профиля:
сообщение 18.1.2008, 11:19
Сообщение #11


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(flankerr @ 17.1.2008, 19:01) *
Но вот как получить прямоугольник в пикселах сколкьо занимает текст не понятно. Хотя в документации и сказно что это должна делать
boundingRect однако на практике увы....
Тебе как я понимаю нужна точность до пикселя?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 18.1.2008, 11:22
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(ViGOur @ 17.1.2008, 19:14) *
А если попробовать посчитать посимвольно?
С помощью: QRect QFontMetrics::boundingRect ( QChar ch ) const.


boundingRect('A') == boundingRect('a') == boundingRect ('_')
и это равенство противоречит описанию результата для данной функции...(или я что-то не понимаю...)

Rect описывающий заглавную букву можно найти таким вот образом (как уже писал выше)
rect = fm.boundingRect('A')
-(rect.top() + rect.bottom() + fm.lineWidth())

как узнать высоту произвольного символа остаються загадкой.... Завбавно получается - функций много а результат противоречит ожидаемому и описанному в документации....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 18.1.2008, 11:25
Сообщение #13


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(ViGOur @ 18.1.2008, 11:19) *
Цитата(flankerr @ 17.1.2008, 19:01) *
Но вот как получить прямоугольник в пикселах сколкьо занимает текст не понятно. Хотя в документации и сказно что это должна делать
boundingRect однако на практике увы....
Тебе как я понимаю нужна точность до пикселя?


погрешность в один пиксель на маленьклм разрешении и маленьком размере шрифта выливается в более чем ощутимую погрешность елси тоже самое применить на большем разрешении...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 18.1.2008, 11:50
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


кстати нашёл ещё интересную вещь

QFontMetrics::underlinePos ()
Возвращает расстояние от базовой линии до места, в котором должна рисаваться подчеркивающая линия.

int QFontMetrics::strikeOutPos () const
Возвращает расстояние от базовой линии до места, в котором должна рисоваться перечеркивающая линия.

int QFontMetrics::underlinePos () const
Возвращает расстояние от базовой линии до места, в котором должна рисаваться подчеркивающая линия.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.1.2008, 11:54
Сообщение #15


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Вот я тут попробовал русские буквы, можешь посмотреть результат, скорее всего это и заложено, отступы, вроде самого высокого симовла, для самого низкого и прочее.
    QPainter painter( this);

    QFont font=QFont( "Arial", 36);
    painter.setFont( font);

    int x = 50, y = 150;
    painter.drawText( x, y, "_АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩьЫЪЭЮЯ");

    QFontMetrics fm( font);
    QRect rect = fm.boundingRect( "_АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩьЫЪЭЮЯ");

    rect.setLeft( rect.left() + x);
    rect.setTop( rect.top() + y);
    rect.setRight( x + rect.right());
    rect.setBottom( y + rect.bottom());

    painter.drawRect( rect);
По все видимости нужно попробовать посчитать самый высокий и самый низкий из текущего набора...

Сообщение отредактировал ViGOur - 18.1.2008, 11:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 18.1.2008, 12:17
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


boundingRect
выдаёт правильно ширину для заданного текста или символа а вот высоту он выдаёт для самого большого символа в шрифте отсюда и идут все проблемы.
просчитать высоту заданного символа практически не реально. Т.е. можно, НО с предварительно анализом символа и то без гарантий. Т.е. проверять с начала проверять большая буква или маленькая подразумевается что у нее есть верхний апостроф или нет, есть у нё завитки ниже базовой или нет и т.п.
и исходя из этого уже делать прогноз (даже тут точность нет будет лищь прогноз) высоты основываясь на имеющихся возможностях фонтметрикс.
Поэтому казалось бы на первый взгляд тривиальная задача узнать высоту буквы на практике оказывается разрешимой лишь частично

Сообщение отредактировал flankerr - 18.1.2008, 12:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.1.2008, 12:35
Сообщение #17


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(flankerr @ 18.1.2008, 12:17) *
выдаёт правильно ширину для заданного текста или символа а вот высоту он выдаёт для самого большого символа в шрифте отсюда и идут все проблемы.
Вот и я об этом же.

А какая задача стоит, может можно еще как решить ее?

Сообщение отредактировал ViGOur - 18.1.2008, 12:36
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.1.2008, 11:44
Сообщение #18


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


На WinApi таки можно узнать "реальную" высоту строки до пикселя.
Для этого надо перегнать строку в кривые спомощью Path-а. Его можно перегнать в регион, а уже у того запросить охватывающий прямоугольник.

Я сильно с рисовкой под Qt не разбирался, но вполне возможно, есть подобный метод. :)

Сообщение отредактировал Tonal - 19.1.2008, 11:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 5.12.2021, 2:38