#c #qt
#c #qt
Вопрос:
Я создаю пользовательский элемент управления и хотел сделать его достаточно универсальным, чтобы использовать любую ориентацию. Когда я пытаюсь использовать вертикальную ориентацию, текст в формате word не центрируется. Лучше всего это видно на символе «i» на прикрепленном изображении. Есть предложения?
Вот как я визуализирую текст:
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
являются ли координаты центра вашей первой буквы в координатах painteryOffset
это расстояние по вертикали между буквами- Для всех букв определите их ширину и высоту.
- Нарисуйте их в правильном положении. Поскольку при рисовании текста мы задаем его левое верхнее положение, мы задаем его относительно центра, чтобы он был центрирован
- Увеличьте 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;