центрирование текста в формате word

#c #qt

#c #qt

Вопрос:

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

центрирование текста в формате word

Вот как я визуализирую текст:

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

painter — это QPainter. Этот код находится в методе paintEvent().

Комментарии:

1. Я не думал, что вертикальный текст может быть обработан в формате kerned. Может ли это?

2. Я думаю, чтобы сделать это правильно, вам пришлось бы использовать kern вертикально. Это, вероятно, не то, что пытается сделать библиотека Qt.

3. Это горизонтальный интервал текста, который я хотел бы исправить. Я думаю, что при центрировании прямоугольника текст отображается не в каждой букве текста.

Ответ №1:

Я не думаю, что существует функция 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 являются ли координаты центра вашей первой буквы в координатах painter
  • yOffset это расстояние по вертикали между буквами
  • Для всех букв определите их ширину и высоту.
  • Нарисуйте их в правильном положении. Поскольку при рисовании текста мы задаем его левое верхнее положение, мы задаем его относительно центра, чтобы он был центрирован
  • Увеличьте topY на высоту предыдущей буквы и смещение y
  • ЗАДАЧА: Убедитесь, что нарисованный текст находится в пределах границ виджета…

Редактировать

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

  • Разделите исходный прямоугольник на 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. Я надеялся, что мне не придется делать это сложным способом. Большое спасибо за код.

Ответ №2:

Перевод строки после каждого символа может помочь.

Обновить:

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

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

или

 int flags = Qt::AlignCenter | Qt::TextWrapAnywhere;