我正在创建一个自定义控件,并希望使其足够通用以使用任何方向。当我尝试垂直方向时,kerned文本不居中。 您可以通过附加图像中的字符“i”看到最佳效果。 有什么建议吗?
以下是我渲染文字的方式:
int flags = Qt::AlignJustify | Qt::AlignVCenter | Qt::TextWrapAnywhere;
painter.drawText( TextArea, flags, text );
画家是QPainter。此代码位于paintEvent()方法中。
答案 0 :(得分:3)
我不认为有一个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
是字母之间的垂直距离修改强>
在给定矩形内绘制文本的第二种方法:
示例代码:
/* 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 :(得分:1)
在每个角色后面添加换行符可能会有效。
<强>更新强>
另外,我认为你应该删除Qt::AlignJustify
标志。之前我没有注意到你错过了水平定心旗。试试这些标志:
int flags = Qt::AlignVCenter | Qt::AlignHCenter | Qt::TextWrapAnywhere;
或
int flags = Qt::AlignCenter | Qt::TextWrapAnywhere;