Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: jasf от Октябрь 31, 2009, 02:51



Название: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 02:51
Здравствуйте. Посоветуйте, как разобраться вот с такой проблемой (скрин).
Проблема в следующем. Вот я отрисовываю itemсы сверху вниз. Но если я изменяю yOffset начала отрисовки списка на негативные значения, получается, к примеру, часть строки первого itemа должна быть за пределом видимости виджета. Но нет :-), Qt как бы ровняет буквы по верхнему краю и не даёт тексту уехать за пределы картинки. Шрифт создаётся и используется так:
QFont font; font.setPixelSize(15); ... painter.setFont(font);
Как отключить данную фичу? спасибо :)

P.S. извиняюсь за мой английский :)


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: spectre71 от Октябрь 31, 2009, 11:26
Нет такого.
Сделай и выложи тестовый проект.


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 11:35
Ось - Windows 7. Qt Сборка 4.6beta1.. попробывал менять флаги шрифта - не помогает. видимо дело в настройках виджета.
список можно двигать мышкой вверх/вниз.


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: spectre71 от Октябрь 31, 2009, 11:50
Ось - Windows 7. Qt Сборка 4.6beta1.. попробывал менять флаги шрифта - не помогает. видимо дело в настройках виджета.
список можно двигать мышкой вверх/вниз.

Не собирается !

release/treeview.o:treeview.cpp::-1: error: undefined reference to `getBaselineOffset(QFontMetrics*, int)


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 11:51
да есть эта функция в defs.cpp.. может что напортачил при экспорте *PARDON*


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: spectre71 от Октябрь 31, 2009, 11:57
да есть эта функция в defs.cpp.. может что напортачил при экспорте *PARDON*
Надо было проверить прежде чем выкладывать. Ты не добавил defs.cpp в проекте!

Код:
int getBaselineOffset( QFontMetrics* metrics, int lineHeight )
{
   ...
//   return baselineOffset - 1 ;
//   return baselineOffset - 2 ;
   return baselineOffset - 3 ;
}

Все нормально смещается !



Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 14:10
Ну нет же :)
Моя проблема заключается отнюдь не в baseline смещении. Проблема в смещений каждой отдельновзятой буквы при попытке отрисовки текста за пределы видимости окна.
т.е. у меня есть widget, отресайзенный на всё окно. т.е. координата [0,0] виджета совпадает с координатой [0,0] окна.
есть QFont с высотой (height) 14 пикселей.

painter.drawText(10,13,QString("first_item")); - соответствует первой части прикреплённого изображения
painter.drawText(10,9,QString("first_item")); - соответствует второй части..
painter.drawText(10,3,QString("first_item")); - третья часть...

тогда, как я ожидаю поведения, как на нижней полоске изображения.


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: spectre71 от Октябрь 31, 2009, 14:34
Все нормально!

Код:
void CTreeView::paintEvent(QPaintEvent *event) {
  QPainter painter1(this);

  painter1.drawText(10,13,QString("first_item"));
  painter1.drawText(110,9,QString("first_item"));
  painter1.drawText(210,3,QString("first_item"));
}


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 14:44
Спасибо! разобрался. фича в QPainter::setOpacity(не1.0); если установлено opacity - эффект виден на изображениях.


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: spectre71 от Октябрь 31, 2009, 15:05
Спасибо! разобрался. фича в QPainter::setOpacity(не1.0); если установлено opacity - эффект виден на изображениях.

Нет.

Так тоже все нормально

Код:
void CTreeView::paintEvent(QPaintEvent *event) {
  QPainter painter1(this);

  painter1.setOpacity(0.5);
  painter1.drawText(10,13,QString("first_item"));
  painter1.drawText(110,9,QString("first_item"));
  painter1.drawText(210,3,QString("first_item"));
}


Название: Re: Отрисовка текста посредством QFont - особенность.
Отправлено: jasf от Октябрь 31, 2009, 16:44
void CTreeView::paintEvent(QPaintEvent *event)
{
   if(!topItem_)return;
   
   QPainter painter1(this);

   painter1.setOpacity(0.5);
   painter1.drawText(10,13,QString("first_item"));
   painter1.drawText(110,9,QString("first_item"));
   painter1.drawText(210,3,QString("first_item"));
   return;
...
}

и
void CTreeView::paintEvent(QPaintEvent *event)
{
   if(!topItem_)return;
   
   QPainter painter1(this);

   //painter1.setOpacity(0.5);
   painter1.drawText(10,13,QString("first_item"));
   painter1.drawText(110,9,QString("first_item"));
   painter1.drawText(210,3,QString("first_item"));
   return;
...
}
соответственно.

P.S. видимо баг.. или фича. не совсем понятно. может потому, что Qt 4.6 beta1.