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'的宽度大得多?字体中是否有一些我不知道的超大字符?
答案 0 :(得分:1)
这不是Qt问题,因为基础Windows API(GetTextMetrics
和GetTextExtentPoint
)给出了相同的值。
不要忘记字体可能包含许多不常见字符的字形:连字,各种长短划线,符号,dingbats以及您不期望的字母字符。
对于“monospace”字体,我感到有些惊讶,但显然,这些只是字体设计用于字符子集的固定间距。例如,Courier New有几十个字符,宽度是普通字符宽度的两倍,例如U + 0713 SYRIAC LETTER GAMAL:ܓ。
如果在大多数情况下正确就足够了,我会取平均字符宽度,将其四舍五入,然后将其乘以。如果用户需要输入几个异常宽的字符,您可能需要滚动一点,但这不是世界末日。
如果你知道它总是英语,你也可以测量一个大写的W并使用它。