I'm trying to use QPainter::drawText()
to render some Chinese characters. But in certain fonts, there is extra top spacing when drawing the text. Why is this happening to some characters only?
Tested on Qt version 6.6.3 & 5.15.2
Googled some info, but nothing really answers the question:
Meaning of top, ascent, baseline, descent, bottom, and leading in Android's FontMetrics
Qt Forum — Impossible to get true text hight with QFontMetrics/QFontMetricsF
As you can see below: green box is with metric height, while red is with bounding height. Sure, the bounding height does bound the entire text, but there is extra top and bottom spacing.
#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);
}