我一直致力于使用Qt + qml for UI和PoDoFo生成PDF文件的应用程序。除文本呈现外,我需要的所有功能都能正常工作。 PoDoFo使用存在的字体和字体样式但Qt合成粗体,斜体样式并且将常规样式转换为常规样式,如果没有这种样式的字体文件。例如,如果我在Windows上“GenevaSF Thin”PoDoFo将此字体渲染为Thin,但Qt将其渲染为Regular,字体粗细400.其他情况如果我在QFont对象和字体样式中设置粗体和斜体标记“Bold Italic”不存在, Qt原子地采用粗体并应用“斜体”矩阵来生成斜体样式。
在Qt源代码中,我找到了包含方法的 QWindowsFontEngine 类
int QWindowsFontEngine::synthesized() const
{
if(synthesized_flags == -1) {
synthesized_flags = 0;
if(ttf) {
const DWORD HEAD = MAKE_TAG('h', 'e', 'a', 'd');
HDC hdc = m_fontEngineData->hdc;
SelectObject(hdc, hfont);
uchar data[4];
GetFontData(hdc, HEAD, 44, &data, 4);
USHORT macStyle = getUShort(data);
if (tm.tmItalic && !(macStyle & 2))
synthesized_flags = SynthesizedItalic;
if (fontDef.stretch != 100 && ttf)
synthesized_flags |= SynthesizedStretch;
if (tm.tmWeight >= 500 && !(macStyle & 1))
synthesized_flags |= SynthesizedBold;
//qDebug() << "font is" << _name <<
// "it=" << (macStyle & 2) << fontDef.style << "flags=" << synthesized_flags;
}
}
return synthesized_flags;
}
但我不知道如何禁用synthes_flags标志。
示例:
我在Windows上安装了“Geneva SF Light”,“Geneva SF ExtraBold”,“Geneva SF Light Italic”字体,并使用下一代码创建字体:
QFont font;
font.setFamily("Geneva SF");
font.setPointSize(20);
在这种情况下,Qt使用“Geneva SF Light”.ttf文件,但原子地将字体'weight'从QFont :: Light更改为QFont :: Normal,但我需要使用QFont :: Light weight的字体。
其他情况。我创建粗体字:
QFont font;
font.setFamily("Geneva SF");
font.setPointSize(20);
font.setBold(true);
在这种情况下,Qt使用“Geneva SF ExtraBold”.ttf文件,但原子地将字体'weight'从QFont :: ExtraBold更改为QFont :: Bold,但我需要QFont :: ExtraBold权重的字体。
“Bold Italic”风格的示例:
QFont font;
font.setFamily("Geneva SF");
font.setPointSize(20);
font.setBold(true);
font.setItalic(true);
在这种情况下,Qt使用“Geneva SF ExtraBold”.ttf文件,但原子地将字体'weight'从QFont :: ExtraBold更改为QFont :: Bold并应用改变字体角度的转换矩阵,但我需要使用非斜体字体和QFont :: ExtraBold。
也许有可能从QFont使用的.ttf文件中获得重量。