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
相关产品推荐
相关产品推荐

