gpt4 book ai didi

c++ - 为什么 QFontMetrics::maxWidth 会返回这么大的值?

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:52 25 4
gpt4 key购买 nike

Windows 7 SP1
MSVS 2010
Qt 4.8.4

我想确定 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'的宽度大这么多?字体中是否有一些我不知道的超大字符?

最佳答案

这不是 Qt 问题,因为底层 Windows API(GetTextMetricsGetTextExtentPoint)提供相同的值。

不要忘记,一种字体可能包含许多不常见字符的字形:连字、各种长破折号、符号、装饰符号和您意想不到的字母表中的字符。

我对“等宽”字体会发生这种情况感到有点惊讶,但显然,这些只是为该字体设计的字符子集的固定间距。以Courier New为例,有几十个字符的宽度是普通字符宽度的两倍以上,例如U+0713 SYRIAC LETTER GAMAL: WE。

如果大部分时间都是正确的就足够了,我会取平均字符宽度,将它四舍五入一点,然后乘以它。如果用户需要输入几个异常宽的字符,您可能需要稍微滚动一下,但这还不是世界末日。

如果你知道它总是英文,你不妨测量一个大写的 W 并使用它。

关于c++ - 为什么 QFontMetrics::maxWidth 会返回这么大的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14165988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com