2011-11-06 34 views
2

我正在创建一个自定义控件,并希望使其通用性足以使用任何方向。当我尝试垂直方向时,字母文字不居中。 你可以看到最好的与附加图像中的字符'我'。 有什么建议吗?居中字包裹字母文字

centering kerned text

这里是我如何渲染文本:

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

画家是一个QPainter的。这段代码在paintEvent()方法中。

+0

我不认为垂直文本可以kerned。它可以? – Pubby

+0

为了做到这一点,我想你必须垂直。尽管如此,这可能不是Qt图书馆想要做的。 – ObscureRobot

+0

这是我想要修复的文本的水平间距。我认为这是矩形中心文本呈现不是每个字母的文字。 – Jay

回答

1

把换行的每个字符可能做的伎俩后。

更新:

另外,我觉得你应该删除Qt::AlignJustify标志。之前我没有注意到你错过了水平居中标志。试试这些标志:

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

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

这可能会工作...我也会尝试一个 – Jay

+0

Bah!不起作用。听起来像一个好主意,但。 – Jay

+0

将HCenter和换行结合起来确实有效。 – Jay

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是封其宽度和高度之间
  • 对于所有的信件得到的垂直距离。
  • 在正确的位置绘制它们。由于当文本被绘制时,我们给它的左上角位置,我们给它的中心以使其居中
  • 将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)); 

} 

希望它可以帮助...

+0

我希望我不会这么难。非常感谢代码。 – Jay