QFont::weight()

2025-06-06

QFont::weight() とは何か

QFont クラスは、テキストを描画する際に使用するフォントの様々な属性(フォントファミリー、サイズ、スタイルなど)を設定するために使われます。その属性の一つが「太さ(weight)」です。QFont::weight() は、現在設定されているフォントの太さを整数値で返します。

太さの指定方法と値

フォントの太さは、QFont::setWeight() 関数を使って設定できます。この際、Qtはいくつか定義済みの列挙型 (QFont::Weight) を提供しており、それらを使用するのが一般的です。これらの列挙型は、それぞれ特定の整数値に対応しています。

一般的な QFont::Weight の値とそれに対応する整数値は以下の通りです(Qtのバージョンによって若干異なる場合がありますが、基本的な概念は同じです):

  • QFont::Black: 87
  • QFont::ExtraBold: (Qt5以降に追加された可能性あり)
  • QFont::Bold: 75 (太字)
  • QFont::DemiBold: 63
  • QFont::Medium: 57 (Qt6から追加された可能性あり)
  • QFont::Normal: 50 (通常の太さ)
  • QFont::Light: 25
  • QFont::ExtraLight: 12
  • QFont::Thin: 0

QFont::weight() は、これらの整数値を返します。

#include <QFont>
#include <QDebug> // デバッグ出力用

int main() {
    QFont font; // デフォルトフォントを作成

    // デフォルトフォントの太さを取得
    int defaultWeight = font.weight();
    qDebug() << "デフォルトフォントの太さ (Weight):" << defaultWeight;

    // 太字に設定
    font.setWeight(QFont::Bold);
    int boldWeight = font.weight();
    qDebug() << "太字フォントの太さ (Weight):" << boldWeight;

    // 細字に設定
    font.setWeight(QFont::Light);
    int lightWeight = font.weight();
    qDebug() << "細字フォントの太さ (Weight):" << lightWeight;

    return 0;
}

このコードを実行すると、コンソールに以下のような出力が表示されるでしょう(具体的な値は環境によって異なる場合があります):

デフォルトフォントの太さ (Weight): 50
太字フォントの太さ (Weight): 75
細字フォントの太さ (Weight): 25


ここでは、QFont::weight()に関連する一般的なエラーとトラブルシューティングについて説明します。

QFont::setWeight()での引数の誤り(特にQt6以降)

エラーの症状

  • 実行時エラーまたは警告: QFont::setWeight: Weight must be between 1 and 1000, attempted to set 0. (Qt6で特に見られる)
  • コンパイルエラー: invalid conversion from 'int' to 'QFont::Weight'

原因
Qt5まではQFont::setWeight()に直接整数値を渡すことができましたが、Qt6からはQFont::Weightという列挙型を引数として取るようになりました。以前のバージョンで使っていた整数値(特にQFont::Normalが0に対応していた時期など)をそのままQt6で使うと、型不一致や範囲外の値としてエラーになることがあります。

トラブルシューティング

  • Qt6の仕様を確認する
    Qt6のドキュメントでQFont::Weightの具体的な値(1〜1000の範囲)を確認し、それに合わせて調整します。
  • QFont::Weight列挙型を使用する
    QFont::Normal, QFont::Bold, QFont::Light などのQtが提供する列挙型を使用します。
    // 悪い例 (Qt6でエラーになる可能性あり)
    // font.setWeight(75);
    // font.setWeight(50); // QFont::Normalが0だった時期の慣習
    
    // 良い例
    font.setWeight(QFont::Bold);
    font.setWeight(QFont::Normal);
    font.setWeight(QFont::Weight(75)); // 明示的にキャストすることも可能
    

設定した太さが反映されない

エラーの症状

  • QFont::weight()で取得した値は正しいが、表示に変化がない。
  • QFont::setWeight()で太字に設定しても、実際に表示されるフォントが太字にならない。

原因

  1. システムに適切なフォントがインストールされていない
    設定しようとしている太さのフォント(例: "Noto Sans Bold"など)がシステムにインストールされていない場合、Qtは最も近い利用可能なフォントを選択します。その結果、意図した太さにならないことがあります。
  2. フォントファミリーとの不一致
    特定のフォントファミリーは、その太さのバリエーション(例: Thin, Light, Regular, Bold, Blackなど)をすべて持っているわけではありません。例えば、「MyCustomFont」というフォントに「Bold」のバリエーションがない場合、QFont::Boldを設定しても反映されない可能性があります。
  3. 描画コンテキストの問題
    QWidget::setFont()QPainter::setFont()など、フォントを設定する場所が適切でない場合。特に、カスタムペイントを行う場合、QPainterに設定するフォントが重要です。
  4. スタイルシートの競合
    Qtスタイルシート(QSS)を使用している場合、スタイルシートがフォントの太さを上書きしている可能性があります。

トラブルシューティング

  • 描画場所の確認
    適切なウィジェットまたはQPainterにフォントが設定されているか再確認します。qApp->setFont()でアプリケーション全体に設定する方法や、特定のウィジェットにwidget->setFont()で設定する方法があります。
  • スタイルシートの確認
    QSSを使用している場合は、font-weightプロパティが意図せず設定されていないか確認します。QSSはウィジェットに直接設定されたフォントを上書きする可能性があります。
    /* 例: QLabelのフォント太さをBoldに強制する */
    QLabel {
        font-weight: bold;
    }
    
  • フォントファミリーの確認
    QFontDatabaseクラスを使って、システムにインストールされているフォントファミリーとその利用可能なスタイル(太さ、イタリックなど)をリストアップしてみるのも有効です。
  • QFontInfoを使用する
    QFontInfoクラスを使用して、実際に使用されているフォントの情報を取得します。これにより、Qtがどのフォントと太さを選択したかを確認できます。
    QFont font;
    font.setFamily("Arial");
    font.setWeight(QFont::Bold);
    
    QFontInfo fontInfo(font);
    qDebug() << "要求したフォントファミリー:" << font.family();
    qDebug() << "要求した太さ:" << font.weight();
    qDebug() << "実際に使用されているフォントファミリー:" << fontInfo.family();
    qDebug() << "実際に使用されている太さ:" << fontInfo.weight();
    qDebug() << "太字であるか?:" << fontInfo.bold();
    
    fontInfo.weight()が期待する値と異なる場合、システムにその太さのフォントが存在しないか、他の理由で代替フォントが使われている可能性が高いです。
  • フォントのインストールを確認
    目的のフォントのすべてのバリエーション(Regular, Boldなど)がシステムにインストールされていることを確認します。

エラーの症状

  • QFont::weight()が返す数値が、ドキュメントに記載されているQFont::Weight列挙型の値と少し異なる。

原因

  • フォント自体のメタデータ
    フォントファイル自体が持っている太さの情報と、Qtが提供する一般的なQFont::Weightの値が完全に一致しないことがあります。
  • Qtのバージョン
    Qtのバージョンによって、QFont::Weight列挙型に対応する整数値がわずかに異なる場合があります。また、フォントの太さの内部表現は、OSやフォントドライバによっても異なることがあります。
  • QFontInfo::bold()を使用する
    厳密な数値ではなく、フォントが「太字」として扱われるかどうかを判断したい場合は、QFontInfo::bold()を使用するのが最も確実です。
    QFont font;
    font.setWeight(QFont::Bold);
    QFontInfo info(font);
    if (info.bold()) {
        qDebug() << "フォントは太字です。";
    }
    
  • 許容範囲として扱う
    QFont::weight()が返す値はあくまで目安として捉え、厳密な一致ではなく、例えば「50に近い値ならNormal」「75に近い値ならBold」といった柔軟な判断をします。


フォントの太さを設定して表示する基本的な例

この例では、QLabel ウィジェットに表示されるテキストのフォントの太さを変更します。

#include <QApplication>
#include <QLabel>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("QFont::weight() Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    // 通常の太さのラベル
    QLabel *normalLabel = new QLabel("これは通常の太さのテキストです。");
    QFont normalFont = normalLabel->font(); // 現在のフォントを取得
    normalFont.setWeight(QFont::Normal);   // 通常の太さに設定
    normalLabel->setFont(normalFont);
    layout->addWidget(normalLabel);

    // 太字のラベル
    QLabel *boldLabel = new QLabel("これは太字のテキストです。");
    QFont boldFont = boldLabel->font();
    boldFont.setWeight(QFont::Bold);       // 太字に設定
    boldLabel->setFont(boldFont);
    layout->addWidget(boldLabel);

    // 細字のラベル
    QLabel *lightLabel = new QLabel("これは細字のテキストです。");
    QFont lightFont = lightLabel->font();
    lightFont.setWeight(QFont::Light);     // 細字に設定
    lightLabel->setFont(lightFont);
    layout->addWidget(lightLabel);

    // QFont::weight() を使って現在の太さを確認
    QLabel *weightInfoLabel = new QLabel();
    QFont currentFont = boldLabel->font(); // 太字ラベルのフォントを再取得
    weightInfoLabel->setText(QString("「太字」ラベルの現在のフォント太さ: %1")
                                 .arg(currentFont.weight()));
    layout->addWidget(weightInfoLabel);

    window->show();

    return app.exec();
}

解説

  • 最後に、boldLabel のフォントをもう一度取得し、currentFont.weight() を使ってその数値(例えば QFont::Bold なら75)を取得し、表示しています。
  • 設定を変更した QFont オブジェクトを label->setFont(modifiedFont) でウィジェットに再設定します。
  • 取得した QFont オブジェクトに対して setFont.setWeight(QFont::Weight) を呼び出し、太さを設定します。ここでは QFont::NormalQFont::BoldQFont::Light といった列挙型を使用しています。
  • まず QLabel を作成し、そのウィジェットの現在のフォントを label->font() で取得します。

スライダーでフォントの太さを動的に変更する例

この例では、QSlider を使ってユーザーがフォントの太さをインタラクティブに変更できるようにします。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QSlider>
#include <QFont>
#include <QDebug> // デバッグ出力用

int main(int argc, char *argv[]) {
    QApplication app(argc_argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Dynamic Font Weight");

    QVBoxLayout *layout = new QVBoxLayout(window);

    QLabel *textLabel = new QLabel("フォントの太さを変えてみましょう!");
    textLabel->setAlignment(Qt::AlignCenter); // テキストを中央寄せに
    layout->addWidget(textLabel);

    QSlider *weightSlider = new QSlider(Qt::Horizontal);
    // QFont::Weight の範囲 (0-99 が一般的ですが、Qt6では1-1000) に合わせる
    // ここでは一般的な範囲の例として0-99を使用
    weightSlider->setRange(0, 99);
    weightSlider->setValue(50); // 初期値は Normal (50) に設定

    layout->addWidget(weightSlider);

    // スライダーの値が変更されたときにフォントの太さを更新
    QObject::connect(weightSlider, &QSlider::valueChanged, textLabel, [=](int value) {
        QFont font = textLabel->font();
        // Qt6の場合、setWeightはQFont::Weight型を取るため、明示的にキャスト
        // Qt5の場合は直接intを渡せますが、Qt6互換のためキャスト推奨
        font.setWeight(static_cast<QFont::Weight>(value));
        textLabel->setFont(font);

        qDebug() << "スライダーの値:" << value << ", 設定されたフォント太さ:" << font.weight();
    });

    window->show();

    return app.exec();
}

解説

  • qDebug() を使って、スライダーの値と実際に設定されたフォントの太さをコンソールに出力し、デバッグに役立てています。
  • ラムダ関数内で、スライダーから受け取った整数値 (value) を QFont::setWeight() に渡してフォントの太さを設定します。static_cast<QFont::Weight>(value) を使用することで、Qt6でも問題なく動作するようにしています。
  • QSlider::valueChanged シグナルを QLabel のフォントを更新するラムダ関数に接続します。
  • QSlider を作成し、その範囲をフォントの太さの値に合わせて設定します。ここでは、一般的な QFont::Weight の整数値の範囲(例: 0から99)を想定しています。

フォントの太さを設定しても、システムにその太さのフォントが存在しない場合、意図した通りに反映されないことがあります。QFontInfo を使うと、実際に適用されているフォントの情報を取得できます。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QFont>
#include <QFontInfo> // QFontInfo を使用
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("QFontInfo Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    QLabel *testLabel = new QLabel("このテキストの太さを確認します。");
    layout->addWidget(testLabel);

    // フォントを設定
    QFont requestedFont = testLabel->font();
    requestedFont.setFamily("Arial"); // 例えば Arial を指定
    requestedFont.setWeight(QFont::Black); // 最も太い Black を要求
    testLabel->setFont(requestedFont);

    // QFontInfo を使って実際に適用されたフォント情報を取得
    QFontInfo actualFontInfo(testLabel->font());

    QLabel *infoLabel = new QLabel();
    QString infoText = QString("要求した太さ: %1 (%2)\n")
                       .arg(requestedFont.weight())
                       .arg(QString::number(requestedFont.weight())); // QFont::Weight の数値も表示

    infoText += QString("実際に適用されたフォントファミリー: %1\n")
                .arg(actualFontInfo.family());
    infoText += QString("実際に適用された太さ: %1\n")
                .arg(actualFontInfo.weight());
    infoText += QString("太字と認識されているか: %1")
                .arg(actualFontInfo.bold() ? "はい" : "いいえ");

    infoLabel->setText(infoText);
    layout->addWidget(infoLabel);

    qDebug() << "要求したフォントの太さ:" << requestedFont.weight();
    qDebug() << "実際に適用されたフォントの太さ:" << actualFontInfo.weight();
    qDebug() << "太字と認識されているか:" << actualFontInfo.bold();

    window->show();

    return app.exec();
}
  • 要求した太さと実際に適用された太さが異なる場合、システムにその太さのフォントが存在しないか、他のフォントが代替として使われている可能性があります。
  • actualFontInfo.family() で実際に使用されたフォントファミリーを、actualFontInfo.weight() で実際に適用された太さの数値を、そして actualFontInfo.bold() でそのフォントがシステムで「太字」として認識されているかどうかを確認しています。
  • QFontInfo actualFontInfo(testLabel->font()) を使って、QLabel に実際に適用されているフォントの情報を取得します。testLabel->font() は、Qtが最適なフォントを選択した後の最終的なフォントオブジェクトを返します。
  • QLabel のフォントファミリーを「Arial」に設定し、太さを QFont::Black に設定します。


QFont::setBold(bool) と QFont::bold() の利用

QFont::weight() の最も直接的な代替かつ簡潔な方法です。

  • QFont::bold(): フォントが太字に設定されている場合に true を返します。
  • QFont::setBold(bool enable): フォントを太字にするかどうかの真偽値を設定します。true を渡すと太字に、false を渡すと通常(または以前設定された太さ)に戻します。

利点

  • クロスプラットフォームの一貫性
    QFont::Bold のような具体的な数値(例: 75)を使うよりも、setBold(true) の方が、異なるOSやフォント環境での「太字」の解釈に対して、Qtが最適な処理を行う可能性が高まります。Qtが内部的に適切な weight 値を選択してくれます。
  • 簡潔性
    「太字かどうか」というシンプルな概念を扱うため、コードが読みやすくなります。

使用例

#include <QApplication>
#include <QLabel>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("QFont::setBold() Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    // setBold(true) を使用して太字に設定
    QLabel *boldLabel = new QLabel("これは setBold(true) で太字にしたテキストです。");
    QFont boldFont = boldLabel->font();
    boldFont.setBold(true); // 太字に設定
    boldLabel->setFont(boldFont);
    layout->addWidget(boldLabel);
    qDebug() << "setBold(true)後の太さ:" << boldFont.weight(); // 内部的なweight値を確認

    // setBold(false) を使用して通常の太さに戻す
    QLabel *normalLabel = new QLabel("これは setBold(false) で通常に戻したテキストです。");
    QFont normalFont = normalLabel->font();
    normalFont.setBold(false); // 通常の太さに戻す
    normalLabel->setFont(normalFont);
    layout->addWidget(normalLabel);
    qDebug() << "setBold(false)後の太さ:" << normalFont.weight(); // 内部的なweight値を確認

    // bold() を使って確認
    QLabel *checkLabel = new QLabel();
    if (boldLabel->font().bold()) {
        checkLabel->setText("上の太字ラベルは bold() で太字と認識されています。");
    } else {
        checkLabel->setText("上の太字ラベルは bold() で太字と認識されていません。");
    }
    layout->addWidget(checkLabel);

    window->show();
    return app.exec();
}

Qt スタイルシート (QSS) の利用

Qt スタイルシートは、HTML/CSS に似た構文で UI の見た目をカスタマイズする方法です。フォントの太さも QSS で設定できます。

利点

  • 動的な変更
    ランタイムにスタイルシートをロードし直すことで、アプリケーションの見た目を動的に変更できます。
  • 柔軟性
    アプリケーション全体のテーマ設定や、特定のウィジェットグループに対するスタイル適用が容易になります。
  • デザインとロジックの分離
    UI の見た目に関する記述を C++ コードから分離できます。

欠点

  • 複雑なフォント設定(特定のフォントファイルのロードなど)には向かない場合があります。

使用例

// main.cpp
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("QSS Font Weight Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    QLabel *label1 = new QLabel("これはスタイルシートで 'font-weight: normal;'");
    // QLabelにスタイルシートを設定
    label1->setStyleSheet("QLabel { font-weight: normal; }");
    layout->addWidget(label1);

    QLabel *label2 = new QLabel("これはスタイルシートで 'font-weight: bold;'");
    label2->setStyleSheet("QLabel { font-weight: bold; color: blue; }");
    layout->addWidget(label2);

    QPushButton *button = new QPushButton("これはボタンのスタイルシートで 'font-weight: 900;'");
    // 数値指定も可能 (100-900 程度)
    button->setStyleSheet("QPushButton { font-weight: 900; background-color: lightgray; }");
    layout->addWidget(button);

    window->show();
    return app.exec();
}

QSS での font-weight の値

  • 100, 200, 300, 400, 500, 600, 700, 800, 900 (数値指定。CSS の一般的な値で、400normal700bold に相当することが多いです)
  • bolder, lighter (親要素からの相対的な太さ)
  • bold (太字)
  • normal (通常の太さ)

特定のフォントファミリーがどのような太さ(スタイル)をサポートしているかを確認し、それらを直接指定したい場合に役立ちます。

利点

  • フォントの利用可能性の確認
    ユーザーのシステムで利用可能なフォントのスタイルをプログラム的に調べることができます。
  • 精度の高い制御
    システムにインストールされているフォントの実際のバリエーション(例: "Arial Light", "Arial Black")を正確に利用できます。

使用例

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QFont>
#include <QFontDatabase> // QFontDatabase を使用
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("QFontDatabase Example");

    QVBoxLayout *layout = new QVBoxLayout(window);

    QLabel *label = new QLabel("利用可能なArialのスタイルを試します。");
    layout->addWidget(label);

    // QFontDatabase を使って "Arial" フォントのスタイルを列挙
    QFontDatabase fontDb;
    QStringList styles = fontDb.styles("Arial"); // "Arial" の利用可能なスタイルを取得

    qDebug() << "Arialの利用可能なスタイル:";
    for (const QString &style : styles) {
        qDebug() << style;

        // 各スタイルを試す(例として最初の3つ)
        if (layout->count() < 4) { // 最初のラベルと3つのスタイルを表示
            QLabel *styleLabel = new QLabel(QString("Arial (%1)").arg(style));
            QFont font;
            font.setFamily("Arial");
            font.setStyleName(style); // スタイル名を直接設定
            styleLabel->setFont(font);
            layout->addWidget(styleLabel);
            qDebug() << "設定されたスタイル名:" << style << ", そのweight:" << font.weight();
        }
    }

    // 例えば、特定の太さのフォントを名前で検索して設定することも可能
    if (fontDb.has	Family("Noto Sans")) {
        // "Noto Sans Bold" のようなスタイル名が存在する場合
        QFont notoBold = fontDb.font("Noto Sans", "Bold", 12);
        QLabel *notoLabel = new QLabel("これは Noto Sans Bold です (FontDatabaseで取得)。");
        notoLabel->setFont(notoBold);
        layout->addWidget(notoLabel);
        qDebug() << "Noto Sans Bold のweight:" << notoBold.weight();
    }


    window->show();
    return app.exec();
}

解説

  • fontDb.font(QString family, QString style, int pointSize) のように、ファミリー名とスタイル名を指定して直接 QFont オブジェクトを生成することも可能です。
  • 取得したスタイル名を font.setStyleName(style) で直接 QFont オブジェクトに設定することで、そのフォントの正確なバリエーションを使用できます。
  • fontDb.styles("Font Family Name") で、特定のフォントファミリーが持つスタイル(例: "Regular", "Bold", "Light", "Italic" など)のリストを取得できます。

QFont::weight() はフォントの太さを数値で扱うための基本的な方法ですが、状況に応じて以下の代替・関連機能を検討すると、より簡潔で柔軟な、または正確なフォント制御が可能になります。

  • システムにインストールされているフォントの具体的なバリエーションを正確に利用したい場合や、フォントの利用可能性を確認したい場合には QFontDatabase が役立ちます。
  • UI の見た目を C++ コードから分離したい場合や、動的なテーマ変更には QSS が非常に強力です。
  • 太字/通常の設定・確認には QFont::setBold()QFont::bold() が最もシンプルで推奨されます。