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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отрисовка текста посредством QFont - особенность.  (Прочитано 5688 раз)
jasf
Гость
« : Октябрь 31, 2009, 02:51 »

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

P.S. извиняюсь за мой английский Улыбающийся
« Последнее редактирование: Октябрь 31, 2009, 02:56 от jasf » Записан
spectre71
Гость
« Ответ #1 : Октябрь 31, 2009, 11:26 »

Нет такого.
Сделай и выложи тестовый проект.
Записан
jasf
Гость
« Ответ #2 : Октябрь 31, 2009, 11:35 »

Ось - Windows 7. Qt Сборка 4.6beta1.. попробывал менять флаги шрифта - не помогает. видимо дело в настройках виджета.
список можно двигать мышкой вверх/вниз.
« Последнее редактирование: Октябрь 31, 2009, 11:43 от jasf » Записан
spectre71
Гость
« Ответ #3 : Октябрь 31, 2009, 11:50 »

Ось - Windows 7. Qt Сборка 4.6beta1.. попробывал менять флаги шрифта - не помогает. видимо дело в настройках виджета.
список можно двигать мышкой вверх/вниз.

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

release/treeview.o:treeview.cpp::-1: error: undefined reference to `getBaselineOffset(QFontMetrics*, int)
Записан
jasf
Гость
« Ответ #4 : Октябрь 31, 2009, 11:51 »

да есть эта функция в defs.cpp.. может что напортачил при экспорте *PARDON*
Записан
spectre71
Гость
« Ответ #5 : Октябрь 31, 2009, 11:57 »

да есть эта функция в defs.cpp.. может что напортачил при экспорте *PARDON*
Надо было проверить прежде чем выкладывать. Ты не добавил defs.cpp в проекте!

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

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

Записан
jasf
Гость
« Ответ #6 : Октябрь 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")); - третья часть...

тогда, как я ожидаю поведения, как на нижней полоске изображения.
Записан
spectre71
Гость
« Ответ #7 : Октябрь 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"));
}
Записан
jasf
Гость
« Ответ #8 : Октябрь 31, 2009, 14:44 »

Спасибо! разобрался. фича в QPainter::setOpacity(не1.0); если установлено opacity - эффект виден на изображениях.
Записан
spectre71
Гость
« Ответ #9 : Октябрь 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"));
}
Записан
jasf
Гость
« Ответ #10 : Октябрь 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.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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