Я не думаю, что есть функция 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));
}
Надеюсь, это поможет ...