1

Windows 7 SP1
MSVS 2010
Qt 4.8.4

QLineEditウィジェットに収まらなければならない最大文字数を知っている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」の幅よりもはるかに大きいのはなぜですか?私が気付いていないフォントに超大きな文字がありますか?

4

1 に答える 1

1

基礎となる Windows API (GetTextMetricsおよびGetTextExtentPoint) が同じ値を与えるため、これは Qt の問題ではありません。

フォントには、合字、さまざまな長いダッシュ、記号、絵文字、予期しないアルファベットの文字など、通常とは異なる文字のグリフが多数含まれている場合があることを忘れないでください。

これが「モノスペース」フォントで発生することに少し驚いていますが、明らかに、それらはフォントが設計された文字のサブセットの固定ピッチにすぎません。たとえば、Courier New には、U+0713 SYRIAC LETTER GAMAL: などのように、平均的な文字の 2 倍以上の幅の文字が数十文字あります。

ほとんどの場合正しいことで十分な場合は、平均文字幅を取得し、少し切り上げて乗算します。ユーザーが非常に幅の広い複数の文字を入力する必要がある場合は、少しスクロールする必要があるかもしれませんが、それで終わりではありません。

常に英語になることがわかっている場合は、大文字の W を測定してそれを使用することもできます。

于 2013-01-04T23:37:25.563 に答える