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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выравнивание текста в QLabel по baseline  (Прочитано 9103 раз)
Alp
Гость
« : Сентябрь 08, 2009, 20:13 »

Столкнулся с проблемой разного выравнивания по вертикали.
Есть 2 QLabel в QHBoxLayout, в одном лейбле текст "abcdef", в другом - "abcdefg". Оба лейбла рисуются разным шрифтом. В итоге текст в лейблах отрисовывается на разном уровне. Хочется этого избежать. В сторону чего смотреть, ассистант молчал насчет baseline in qlabel.
« Последнее редактирование: Сентябрь 08, 2009, 20:29 от Alp » Записан
kirill
Гость
« Ответ #1 : Сентябрь 09, 2009, 05:27 »

Код
C++ (Qt)
//вычисляем размеры шрифтов у обоих лэйблов
QFontMetrics fm1(label1->font());
QFontMetrics fm2(label2->font());
//Берем квадраты
QRect rect1 = fm1->boundingRect(label1->text());
QRect rect2 = fm2->boundingRect(label2->text());
//Считаем разницу в высоте
uint dlHeight = rect2.height() > rect1.height() ? rect2.height() - rect1.height() : rect1.height() - rect2.height() ;
//наименьший лэйбл
QLabel * minLabel = rect2.height() < rect1.height() ? label2 : label1;
//выравниваем
int left, top, right, bottom;
minLabel->getContentsMargins(&left, &top, &right, &bottom);
minLabel->setContentsMargins(left, top + dlHeight, right, bottom);
 
Записан
spectre71
Гость
« Ответ #2 : Сентябрь 09, 2009, 07:47 »

Столкнулся с проблемой разного выравнивания по вертикали.
Есть 2 QLabel в QHBoxLayout, в одном лейбле текст "abcdef", в другом - "abcdefg". Оба лейбла рисуются разным шрифтом. В итоге текст в лейблах отрисовывается на разном уровне. Хочется этого избежать. В сторону чего смотреть, ассистант молчал насчет baseline in qlabel.

void QLabel ::setAlignment ( Qt::Alignment )
Записан
Alp
Гость
« Ответ #3 : Сентябрь 09, 2009, 11:01 »

Код
C++ (Qt)
//вычисляем размеры шрифтов у обоих лэйблов
QFontMetrics fm1(label1->font());
QFontMetrics fm2(label2->font());
//Берем квадраты
QRect rect1 = fm1->boundingRect(label1->text());
QRect rect2 = fm2->boundingRect(label2->text());
//Считаем разницу в высоте
uint dlHeight = rect2.height() > rect1.height() ? rect2.height() - rect1.height() : rect1.height() - rect2.height() ;
//наименьший лэйбл
QLabel * minLabel = rect2.height() < rect1.height() ? label2 : label1;
//выравниваем
int left, top, right, bottom;
minLabel->getContentsMargins(&left, &top, &right, &bottom);
minLabel->setContentsMargins(left, top + dlHeight, right, bottom);
 

Ага, спасибо. В общем, получается то же самое, что я сделал - пересчет границ вручную.
Записан
Alp
Гость
« Ответ #4 : Сентябрь 09, 2009, 11:02 »

Столкнулся с проблемой разного выравнивания по вертикали.
Есть 2 QLabel в QHBoxLayout, в одном лейбле текст "abcdef", в другом - "abcdefg". Оба лейбла рисуются разным шрифтом. В итоге текст в лейблах отрисовывается на разном уровне. Хочется этого избежать. В сторону чего смотреть, ассистант молчал насчет baseline in qlabel.

void QLabel ::setAlignment ( Qt::Alignment )
Так в том-то и беда, что при одинаковом расположении базовая линия у надписей на разном уровне при разных шрифтах.
Записан
kwisp
Гость
« Ответ #5 : Сентябрь 10, 2009, 09:23 »

может
QPainter::drawText();
поможет?
он вроде базовую линию использует в одной из варианций с QRect.

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


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