2013-01-04 40 views
1

的Windows 7 SP1
MSVS 2010
的Qt 4.8.4爲什麼QFontMetrics :: maxWidth返回這麼大的值?

我想確定QLineEdit的窗口小部件的知道必須適應它的最大字符數的最大尺寸。

所以,我想用:

int QFontMetrics::maxWidth() const 
Returns the width of the widest character in the font. 

但這:

#include <QApplication> 
#include <QFont> 
#include <QFontMetrics> 
#include <iostream> 

using std::cout; using std::endl; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc,argv); 

    QFontMetrics metrics(QApplication::font()); 
    cout << "Default -  Max width: " << metrics.maxWidth() << " Width of X: " << metrics.width('X') << endl; 
    const QFont f("Monospace", 8); 
    QFontMetrics metrics2(f); 
    cout << "Monospace 8 - Max width: " << metrics2.maxWidth() << " Width of X: " << metrics2.width('X') << endl; 
    const QFont f2("Cambria", 16); 
    QFontMetrics metrics3(f2); 
    cout << "Cambria 16 - Max width: " << metrics3.maxWidth() << " Width of X: " << metrics3.width('X') << endl; 
    return 0; 
} 

輸出這樣的:

Default -  Max width: 23 Width of X: 6 
Monospace 8 - Max width: 23 Width of X: 6 
Cambria 16 - Max width: 91 Width of X: 12 

問題:爲什麼是最大寬度比要大得多'X'的寬度?我不知道字體中是否有超大字符?

回答

1

這不是Qt問題,因爲基礎Windows API(GetTextMetricsGetTextExtentPoint)給出相同的值。

不要忘記一個字體可能包含許多不尋常字符的字形:連字,各種長破折號,符號,dingbats以及您不期待的字母。

我對「monospace」字體發生了這種情況,我感到有些吃驚,但顯然,這些字體只是爲字體子集設計的固定音高。例如,Courier New有幾十個字符,它們的寬度是平均字符寬度的兩倍以上,如U + 0713 SYRIAC LETTER GAMAL:ܓ。

如果正確的話大部分時間足夠了,我會取平均字符寬度,將它舍入一點,然後將其乘以。如果用戶需要輸入幾個非常寬的字符,您可能需要滾動一下,但這不是世界末日。

如果你知道它總是英文,那麼你可以衡量一個資本W並使用它。

+0

這正是我關心的問題 - 我正在寫一個必須有國際支持的應用程序。取決於字體是否支持「W」太過英語/以ASCII爲中心。所以,我會繼續思考;可能編寫我自己的MaxWidth並確定導致此問題的字符是什麼。有趣的是:這個[link](https://bugreports.qt-project.org/browse/QTBUG-13399)報告沒有相同的問題。它輸出'QFontMetrics :: maxWidth'的期望值。但是他正在使用Debian 6,或許我需要深入研究GetTextMetrics,正如你所建議的那樣。謝謝。 –

+0

我也期待着找到哪個坎布里亞字形是'W'大小的8倍。 –

+0

如果您試圖對所有語言和字體100%正確,那麼將最大字符寬度乘以最大字符數就太簡單了。角色可以以驚人的方式結合到字形集羣中。我能想到的大部分可能會比​​組成它們的個人角色更窄,但如果某些角色比組成角色更廣泛,我不會感到驚訝。誰知道什麼樣的字距提示可能也會起作用。 –