我一直致力于使用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标志 .

Examples:

我在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权重的字体 .

“粗体斜体”样式示例:

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文件中获得重量 .