центрирующее слово завернутый текст - PullRequest
2 голосов
/ 06 ноября 2011

Я создаю пользовательский элемент управления и хотел сделать его достаточно универсальным, чтобы использовать любую ориентацию.Когда я пробую вертикальную ориентацию, текст с кернингом не центрируется.Это лучше всего видно с помощью символа «i» на прилагаемом изображении.Любые предложения?

centering kerned text

Вот как я рендеринг текста:

  int flags = Qt::AlignJustify | Qt::AlignVCenter | Qt::TextWrapAnywhere;
  painter.drawText( TextArea, flags, text );

художник QPainter.Этот код находится в методе paintEvent ().

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Я не думаю, что есть функция Qt, которая достигает того, что вы хотите. Однако вы могли бы нарисовать это буква за буквой. Вот как вы могли бы это сделать:

 QFontMetrics fm = painter.fontMetrics();
 QString t = "Sample";

 // Loop through all letters
 int topX = 5;
 int topY = 5;
 int yOffset = 0;

 for (unsigned i=0; i<t.count(); i++)
 {
   QChar c = t.at(i);
   // Get metrics
   int w = fm.width(c);
   int h = fm.height();

   painter.drawText(topX-w/2, topY-h/2, QString("%1").arg(c));

   topY = topY + h + yOffset;
 }

Как это работает

  • Получите метрики шрифта, чтобы вычислить ширину и высоту каждой буквы.
  • topX, topY - координаты центра вашей первой буквы в координатах художника
  • yOffset вертикальное расстояние между буквами
  • Для всех букв получить их ширину и высоту.
  • Нарисуйте их в правильном положении. Поскольку при прорисовке текста мы указываем его верхнюю левую позицию, мы указываем его относительно его центра, чтобы его центрировать
  • Увеличение topY на высоту предыдущей буквы и смещение по y
  • TODO: убедитесь, что нарисованный текст находится в границах виджета ...

EDIT

Второй подход, который рисует текст в данном прямоугольнике:

  • Разделить начальный прямоугольник на n под прямоугольников, где n - количество букв в предоставленной строке.
  • Нарисуйте каждую букву к центру соответствующего под прямоугольника
  • Преимущество этого метода в том, что текст рисуется внутри заданного ограничивающего прямоугольника, поэтому он может соответствовать вертикальным элементам управления ...

Пример кода:

/* Let rect the rectnagle in which we want to draw the vertical text
and t the string we are drawing. rectH is the height of every sub-rectangle */
double rectH = rect.height() / (double) t.count();
for (unsigned i=0; i<t.count(); i++)
{
     QChar c = t.at(i);

     // Draw every char in the corresponding sub rectangle
     painter.drawText(QRect(rect.topLeft().x(),
                rect.topLeft().y() + i*rectH,
                rect.width(),
                rectH),
              Qt::AlignCenter,
              QString("%1").arg(c));

}

Надеюсь, это поможет ...

1 голос
/ 06 ноября 2011

Размещение перевода строки после каждого символа может помочь.

Обновление:

Кроме того, я думаю, вы должны удалить флаг Qt::AlignJustify. Я не замечал раньше, что вы пропускали горизонтальный флаг центрирования. Попробуйте эти флаги:

int flags = Qt::AlignVCenter | Qt::AlignHCenter | Qt::TextWrapAnywhere;

или

int flags = Qt::AlignCenter | Qt::TextWrapAnywhere;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...