41093


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

[code]

    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();
    }
    
[/code]

[![テキストの描画](https://i.stack.imgur.com/Rti0B.png)](https://i.stack.imgur.com/Rti0B.png)

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

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


CC BY-SA 3.0
2018-01-19T06:58:28.353
41083
2018-01-19T11:30:44.807
3337
question
c++ qt macos
macOS上で等幅フォントでのテキストの描画サイズ


自己解決しました。

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

修正前

[code]

    p.setFont(QFont("Monaco", 20));
    
[/code]

修正後

[code]

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

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

[![画像の説明をここに入力](https://i.stack.imgur.com/vywDo.png)](https://i.stack.imgur.com/vywDo.png)

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


CC BY-SA 3.0
2018-01-19T11:30:44.807
41093
2018-01-19T11:30:44.807
3337
41083
answer