You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QPainter::drawText绘制部分汉字出现顶部额外间距及截断问题排查

Qt QPainter绘制汉字时特定字体下的顶部额外间距问题

尝试使用QPainter::drawText()渲染部分汉字,但在特定字体(如Apple LiGothic)下绘制文本时出现顶部额外间距,且仅部分字符存在此问题。

测试环境:Qt 6.6.3 及 5.15.2 版本

已搜索相关资料但未找到明确解答:

  • Android字体度量中top、ascent等参数含义
  • Qt论坛:QFontMetrics/QFontMetricsF无法获取真实文本高度
  • QTBUG-53271:汉字及高DPI文本下FontMetrics边界矩形尺寸错误

如下所示:绿色框为字体度量高度,红色框为边界高度。边界高度虽能包裹全部文本,但存在顶部和底部额外间距。
文本绘制间距示意图

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QPainter>
#include <QFont>
#include <QFontMetrics>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent* event)
{
    // Call base class implementation first
    QMainWindow::paintEvent(event);

    // Obtain the QPainter object
    QPainter paint(this);

    QFont font;
    font.fromString("Apple LiGothic");
    font.setPointSize(50);
    QFontMetrics metric(font);

    paint.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing, true);
    paint.setFont(font);
    paint.setPen(Qt::white);
    const int align = Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap;

    QString text = "钳禾日当午";
    QRect bound = metric.boundingRect(text);
    bound = QRect(0, 0, bound.width(), bound.height());
    QRect metricBound(0, 0, bound.width(), metric.height());
    paint.translate(10, 100);
    paint.setPen(Qt::red);
    paint.drawRect(bound);
    paint.setPen(Qt::green);
    paint.drawRect(metricBound/*.adjusted(0,10,0,10)*/); // hack adjustment
    paint.setPen(Qt::white);
    paint.drawText(0, 0, bound.width(), bound.height(), align, text);

    text = "汗滴禾下土";
    bound = metric.boundingRect(text);
    bound = QRect(0, 0, bound.width(), bound.height());
    metricBound = QRect(0, 0, bound.width(), metric.height());
    paint.translate(0, 100);
    paint.setPen(Qt::red);
    paint.drawRect(bound);
    paint.setPen(Qt::green);
    paint.drawRect(metricBound);
    paint.setPen(Qt::white);
    paint.drawText(0, 0, bound.width(), bound.height(), align, text);
}

内容的提问来源于stack exchange,提问作者Xenius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:42:11