2011-11-06 35 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