Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: qate от Февраль 21, 2014, 08:17



Название: QGraphicsTextItem: обрезка букв курсивного текста
Отправлено: qate от Февраль 21, 2014, 08:17
Пусть необходимо вывести курсивный текст, простейший пример - http://pastebin.com/gfL0X1rZ
Что получается: http://i60.fastpic.ru/big/2014/0221/24/a54a07b24df6c8ecf68b71720eb64b24.png

Какие вижу решения:
1. Думаю лучшим решением будет разрешить тексту вылезать за границы элемента QGraphicsTextItem - можно ли ?
2. Можно для курсива увеличить левый отступ, но setDocumentMargin меняет все отступы вокруг и т.к. текст нужно точно позиционировать - придется много переписать (
3. Поставить пробел перед и после текста - плохой вариант


Название: Re: QGraphicsTextItem: обрезка букв курсивного текста
Отправлено: GreatSnake от Февраль 21, 2014, 10:19
Может проблема в фонте?
Если нет, то всё решится перегрузкой
Код
C++ (Qt)
QRectF QGraphicsTextItem::boundingRect () const [virtual]
и увеличением границ.


Название: Re: QGraphicsTextItem: обрезка букв курсивного текста
Отправлено: deMax от Февраль 21, 2014, 10:37
На 4.8.5 под win7 все ок.


Название: Re: QGraphicsTextItem: обрезка букв курсивного текста
Отправлено: qate от Февраль 21, 2014, 12:15
Может проблема в фонте?
Если нет, то всё решится перегрузкой
Код
C++ (Qt)
QRectF QGraphicsTextItem::boundingRect () const [virtual]
и увеличением границ.

Какая проблема в шрифте? Почти все шрифты так себя ведут.

Перегрузка boundingRect помогла, спасибо !

Да, это было на версии 5.2.0


Название: Re: QGraphicsTextItem: обрезка букв курсивного текста
Отправлено: qate от Февраль 26, 2014, 10:07
Точнее перегрузка boundingRect не помогла, например hover события продолжали приходить для "бывшей" области (чтото еще сломалось)
Решил через установку стилей: (0x0414 =  "Д")
 
Код
C++ (Qt)
void adjustMargin(QGraphicsTextItem* ti)
{
   QTextDocument* d = ti->document();
   if (ti->font().italic())
   {      
       QFontMetricsF fm(ti->font());
       qreal lb = abs(fm.leftBearing(0x0414));
       QString s = QString("p { margin: 0 0 0 %1; }").arg(lb);
       d->setDefaultStyleSheet(s);
   }
   else
       d->setDefaultStyleSheet("p { margin: 0 0 0 0; }");
   ti->setDocument(d);
   ti->setHtml(QString("<html><head/><body><p>%1</p></body></html>").arg(ti->toPlainText()));
}