QT6 源,七章对话框与多窗体(1) QFont 篇一:因为有字体选择对话框的,故熟悉下字体, QFont,本篇介绍其成员函数

(1)本类,老师在课本里没有讲。所以,大致测试一下其成员函数。还有一处,老师没有讲,就是文本格式类。

在这里插入图片描述

(2)访问 控件的 QFont 属性,是由窗体基类, QWidget 提供的

在这里插入图片描述

++

在这里插入图片描述

(3) 本 QFont 类并不继承于 QObject ,也没有属性,成员函数全是 public 权限的

在这里插入图片描述

++补充另一个成员函数,关于 family

在这里插入图片描述

(4)

在这里插入图片描述

++补充下点大小 pointSize 与像素大小 pixelSize 的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

++ 所以,要多用 点大小的成员函数

(5) 关于字体 style 的内容很多,集中于此,虽然感觉并不重要

在这里插入图片描述

++ 给出其代码版

class QFont {
public:
    //这个枚举描述了用于显示文本的不同字体样式。
    enum Style {
        StyleNormal,
        StyleItalic, //专门为表示斜体文本而设计的斜体字形。
        StyleOblique //具有斜体外观的字符,通常基于未加修饰的字符,
        //但未经过专门微调以用于表示斜体文本。
    };
    Q_ENUM(Style)

    Style              style() const;   //style 里最有用的就是斜体。用下面的 italic()更好
    void            setStyle(Style style);

    QString            styleName() const;
    void            setStyleName(const QString &);

    inline bool        italic() const {  return (  style() != StyleNormal  )    ; }
    inline void     setItalic(bool b) {  setStyle(b ? StyleItalic : StyleNormal); }
    
    //样式提示用于字体匹配算法,当选定的字体系列不可用时,帮助找到合适的默认系列。
    enum StyleHint {
        Helvetica,  SansSerif  = Helvetica , //这俩值相等
        Times,      Serif      = Times     , //字体匹配器更喜欢衬线字体。
        Courier,    TypeWriter = Courier   ,
        OldEnglish, Decorative = OldEnglish, //字体匹配器更喜欢装饰性字体。
        System   , //the font matcher prefers system fonts.
        AnyStyle , //让字体匹配算法来选择字体系列。这是默认设置。
        Cursive  ,
        Monospace, //字体匹配器更喜欢映射到CSS通用字体系列'monospace'的字体。
        Fantasy    //字体匹配器更喜欢映射到CSS通用字体系列'fantasy'  的字体。
    };
    Q_ENUM(StyleHint)
    
    StyleHint          styleHint() const;
    void            setStyleHint(StyleHint, StyleStrategy = PreferDefault);
    
    StyleStrategy      styleStrategy() const;
    void            setStyleStrategy(StyleStrategy s);
    
    //样式策略告诉字体匹配算法应该使用哪种类型的字体来找到合适的默认系列。
    enum StyleStrategy {
        PreferDefault       = 0x0001, //默认样式策略。它不偏好任何类型的字体。
        PreferBitmap        = 0x0002, //偏好位图字体(而不是轮廓字体)
        PreferDevice        = 0x0004,
        PreferOutline       = 0x0008, //偏好轮廓字体(而不是位图字体)
        ForceOutline        = 0x0010,
        PreferMatch         = 0x0020,
        PreferQuality       = 0x0040,
        PreferAntialias     = 0x0080,
        NoAntialias         = 0x0100,
        NoSubpixelAntialias = 0x0800,
        PreferNoShaping     = 0x1000,
        NoFontMerging       = 0x8000  //如果为某种书写系统选定的字体不包含请求绘制的字符,
        //那么Qt将自动选择包含该字符的类似样式的字体。`NoFontMerging~标志会禁用此功能。
        //请注意,启用此标志并不会阻止Qt在选定的字体不支持文本的书写系统时自动选择合适的字体。
    };
    Q_ENUM(StyleStrategy)
}

(6)字体的粗细

在这里插入图片描述

(7)字体上的下划线,删除线与上划线

在这里插入图片描述

++ 给出使用上划线的范例,来自一言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数学公式编辑器
使用上划线标注变量或公式:

QTextEdit *formulaEditor = new QTextEdit(this);
formulaEditor->setHtml(   "<span style='text-decoration: overline;'>x</span> 
					    +  <span style='text-decoration: overline;'>y</span> 
					    =  <span style='text-decoration: overline;'>z</span>"  );

文档编辑
强调特定术语:

QTextEdit * docEditor = new QTextEdit(this);
docEditor->insertHtml("<p>关键术语:<span style='text-decoration: overline;'>量子计算</span></p>");

在这里插入图片描述

(8)

在这里插入图片描述

(9)

在这里插入图片描述

(10)

在这里插入图片描述

(11)

在这里插入图片描述

(12)

在这里插入图片描述

(13)

在这里插入图片描述

(14)

在这里插入图片描述

(15)

在这里插入图片描述

(16)

在这里插入图片描述

(17)

在这里插入图片描述

(18)

谢谢

<think>嗯,用户的问题是关于在Qt中如何通过代码实现EUDC.ttf字体宋体之间的专有字符映射,特别是使用QFont的insertSubstitution方法,并且需要示例代码。首先,我需要理解用户的需求。EUDC(End User Defined Characters)字体通常是用来支持用户自定义的字符,比如生僻字。在Windows系统中,有时候应用程序可能会找不到EUDC.TTE字体文件,导致警告或错误,比如用户提到的qt.qpa.fonts警告。用户希望将这些自定义字符正确映射到宋体,确保显示正常。 接下来,我得回忆Qt字体替换的相关机制。Qt提供了QFont类,其中有个静态方法insertSubstitution,可以替换字体族名称。例如,当系统请求使用某个字体时,Qt会自动替换为另字体。这应该适用于将EUDC字体映射到宋体的情况。 不过,用户提到的是专有字符映射,可能需要更细致的处理。因为直接替换整个字体可能不够,特别是如果只有部分字符需要映射。这时候可能需要使用QFontDatabase来添加应用字体,或者使用QFont的setFamily方法指定备用字体。但根据用户提供的引用[2]和[3],问题可能注册表设置有关,但用户现在希望用代码解决,而不是修改注册表。 首先,我需要确定如何正确使用insertSubstitution。假设用户已经安装了EUDC.TTF或TTE字体,可能需要将EUDC的字体族名称映射到宋体。但宋体的字体族名称通常是“SimSun”或“宋体”,需要确认系统中的准确名称。例如,在代码中使用QFont.insertSubstitution("EUDC", "SimSun"),这样当请求EUDC字体时,Qt会使用SimSun代替。 然后,示例代码部分需要展示如何在Qt应用程序初始化时进行字体替换。例如,在main函数中,调用QFont::insertSubstitution。另外,可能需要使用QFontDatabase::addApplicationFont来加载EUDC字体文件,确保字体可用。但用户可能已经安装了该字体,所以可能不需要添加,但为了保险起见,添加字体可能更可靠。 还要考虑字符映射的问题。如果某些Unicode码点被指定在EUDC字体中,替换字体后,这些字符是否在宋体中存在?如果不存在,可能显示为空白或方框。所以,用户可能需要确保宋体或其他字体包含这些字符,或者使用其他字体作为备用。比如,使用insertSubstitution将EUDC替换为包含所需字符的字体列表,如“SimSun, Microsoft YaHei”等。 此外,用户提供的引用中提到修改注册表来改变EUDC的路径,但用户现在希望通过代码实现,而不是修改系统设置。因此,代码层面的解决方案是关键。 可能的步骤包括: 1. 在应用程序启动时,使用QFont::insertSubstitution将EUDC字体族替换为宋体。 2. 使用QFontDatabase::addApplicationFont加载EUDC字体文件,确保应用程序可以访问该字体。 3. 验证字符映射是否正确,可能需要测试显示特定字符。 还需要注意不同平台下的路径问题,比如EUDC.TTE在Windows中的位置通常是C:\Windows\Fonts\,但用户可能自定义了路径。如果字体文件不在标准目录,可能需要使用绝对路径加载。 可能的示例代码结构: 在main函数中: - 添加应用字体QFontDatabase::addApplicationFont("path/to/EUDC.TTE"); - 插入替换:QFont::insertSubstitution("EUDC", "SimSun"); 然后,在界面中使用字体族名称“EUDC”,应该会被替换为宋体。 但需要测试是否有效,或者是否需要使用字体的实际族名,而不是文件名。因为字体的族名可能不是“EUDC”,所以可能需要先获取字体的族名,再替换。例如,加载字体后,查询其族名,再进行替换。 另外,用户的问题可能涉及到私有字符的映射,即某些特定的Unicode位置映射到EUDC中的字形,而替换字体后,这些位置是否被正确映射到宋体的相应字符。这可能涉及到字体内部的字符编码,如果宋体没有这些码点的字形,则替换可能无效。因此,可能需要更复杂的处理,比如使用QFont的fallback机制,或者自定义字体引擎,但这可能超出insertSubstitution的能力范围。 总结:核心解决方案是使用QFont的insertSubstitution方法将EUDC字体族替换为宋体,并确保字体文件被正确加载。示例代码应展示如何在Qt应用程序中进行这些操作,同时处理可能的路径和字体族名称问题。</think>在Qt中实现EUDC字体宋体之间的字符映射,可通过`QFont::insertSubstitution`方法实现字体替换。以下是具体实现步骤和示例代码: ### 实现步骤 1. **加载EUDC字体文件** 使用`QFontDatabase::addApplicationFont`确保应用程序能访问自定义字体文件[^1]。 2. **设置字体替换规则** 通过`QFont::insertSubstitution`将EUDC字体族映射到宋体(SimSun)。 3. **验证字体替换效果** 在界面控件中测试字符显示是否正确。 ### 示例代码 ```cpp #include <QApplication> #include <QFontDatabase> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 1. 加载EUDC字体文件(需确认路径正确性) int fontId = QFontDatabase::addApplicationFont("C:/Windows/Fonts/EUDC.TTE"); if (fontId == -1) { qWarning() << "Failed to load EUDC font"; } else { QStringList fontFamilies = QFontDatabase::applicationFontFamilies(fontId); qDebug() << "Loaded font families:" << fontFamilies; } // 2. 设置字体替换规则 QFont::insertSubstitution("EUDC", "SimSun"); // 将EUDC替换为宋体 // 3. 测试显示效果 QLabel label("测试自定义字符:"); // 假设-是EUDC私有字符 label.setFont(QFont("EUDC", 12)); label.show(); return app.exec(); } ``` ### 关键说明 1. **字体路径验证** - 若字体文件未正确加载,需检查路径是否包含空格或特殊字符,可尝试使用`QDir::toNativeSeparators()`处理路径。 - 可通过`QFontDatabase::applicationFontFamilies`获取已加载字体的实际名称。 2. **替换规则生效范围** - `insertSubstitution`是全局设置,对所有使用该字体族的控件生效。 - 若需动态切换,可结合`QFont::setFamily()`实现[^2]。 3. **字符映射兼容性** - 若宋体未包含目标字符,需追加备用字体,例如: ```cpp QFont font("EUDC"); font.setFallbackFamilies({"SimSun", "Microsoft YaHei"}); label.setFont(font); ``` ### 补充建议 - **私有字符编码检查** 使用`QChar::unicode()`确认字符码点是否EUDC定义致。 - **跨平台兼容性** 在Linux/macOS中需通过`fc-cache`更新字体缓存,确保系统识别自定义字体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值