我不認爲有一個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:檢查繪製的文本是小部件的邊界之內...
編輯
繪製一個給定矩形內的文本第二種方法:
- 將初始矩形拆分爲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));
}
希望它可以幫助...
我不認爲垂直文本可以kerned。它可以? – Pubby
爲了做到這一點,我想你必須垂直。儘管如此,這可能不是Qt圖書館想要做的。 – ObscureRobot
這是我想要修復的文本的水平間距。我認爲這是矩形中心文本呈現不是每個字母的文字。 – Jay