Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Alp от Сентябрь 08, 2009, 20:13



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


Название: Re: Выравнивание текста в QLabel по baseline
Отправлено: kirill от Сентябрь 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);
 


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

void QLabel ::setAlignment ( Qt::Alignment )


Название: Re: Выравнивание текста в QLabel по baseline
Отправлено: Alp от Сентябрь 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);
 

Ага, спасибо. В общем, получается то же самое, что я сделал - пересчет границ вручную.


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

void QLabel ::setAlignment ( Qt::Alignment )
Так в том-то и беда, что при одинаковом расположении базовая линия у надписей на разном уровне при разных шрифтах.


Название: Re: Выравнивание текста в QLabel по baseline
Отправлено: kwisp от Сентябрь 10, 2009, 09:23
может
QPainter::drawText();
поможет?
он вроде базовую линию использует в одной из варианций с QRect.