macOS上で等幅フォントでのテキストの描画サイズ

投稿者: Anonymous

macOS、C++、Qt5でGUIアプリを作っています。等幅フォントを指定してテキストを描画します。このとき、半角10文字より全角5文字の方が実際に描画されるサイズが短くなります。

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.setFont(QFont("Monaco", 20));
    p.drawText(0, 30, "WWWWWWWWWW");
    p.drawText(0, 60, "||||||||||");
    p.drawText(0, 90, "あああああ");
    qDebug() << p.fontMetrics().size(0, "WWWWWWWWWW").width();
    qDebug() << p.fontMetrics().size(0, "||||||||||").width();
    qDebug() << p.fontMetrics().size(0, "あああああ").width();
}

テキストの描画

上記の例では、半角10文字の幅が120px、全角5文字の幅が100pxとして描画されます。
半角10文字と全角5文字が同じ幅で描画されるようにする方法はないでしょうか?

なお、Windowsで同じことを行うと、期待通りのサイズで描画されます。

解決

自己解決しました。

Uncle-Keiさんからいただいたコメントのように、日本語対応の等幅フォントである Osaka を使用するのですが、Osakaには「レギュラー」と「レギュラー-等幅」があって、後者を選択するために一工夫が必要でした。

修正前

p.setFont(QFont("Monaco", 20));

修正後

QFont font = QFontDatabase().font("Osaka", "Regular-Mono", 20);
p.setFont(font);

「レギュラー-等幅」のフォントを作成するため、QFontDatabaseクラスを利用して、Regular-Monoを明示的に指定することで、目的のフォントを取得することができました。

画像の説明をここに入力

参考: https://bugreports.qt.io/browse/QTBUG-41487

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *