QFont::setPointSize()

2025-06-06

QtプログラミングにおけるQFont::setPointSize()は、フォントのサイズをポイント単位で設定するための関数です。

詳しく説明すると以下のようになります。

QFontとは

QFontクラスは、Qtアプリケーションでテキストを描画する際に使用されるフォントの属性(フォントファミリー、サイズ、太さ、イタリックなど)を指定するために使われます。

setPointSize()の役割

setPointSize(int pointSize)は、QFontオブジェクトのフォントサイズをポイント単位で設定するためのメソッドです。

  • ポイント (pt) とは: フォントのサイズを表す一般的な単位で、1ポイントは約1/72インチに相当します。これは、画面の解像度や印刷時のサイズに依存しない「論理的な」サイズであり、異なるデバイスで同じフォントサイズを指定しても、見た目の大きさがほぼ一貫するようにQtが調整してくれます。

使用例

通常、次のように使用します。

#include <QApplication>
#include <QLabel>
#include <QFont>

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

    QLabel label("Hello, Qt!"); // QLabelを作成

    QFont font = label.font(); // 現在のラベルのフォントを取得
    font.setPointSize(24);     // フォントサイズを24ポイントに設定
    font.setBold(true);        // 太字に設定

    label.setFont(font);       // 変更したフォントをラベルに適用

    label.show();              // ラベルを表示

    return app.exec();
}

この例では、QLabelに表示されるテキストのフォントサイズを24ポイントに設定し、さらに太字にしています。

  • 負の値: setPointSize()に0以下の値を設定すると、エラーや未定義の動作を引き起こす可能性があります。通常、正の値を指定する必要があります。
  • setFontの呼び出し: QFontオブジェクトの属性を変更しただけでは、その変更がUIに反映されるわけではありません。変更したQFontオブジェクトを、目的のウィジェット(例: QLabel, QPushButton, QTextEditなど)のsetFont()メソッドに渡すことで、初めて変更が適用されます。
  • 実際の表示サイズ: setPointSize()で設定したポイントサイズは、あくまで「要求する」サイズです。実際にシステムで使用されるフォントのピクセルサイズは、OSの設定(DPIスケーリングなど)や利用可能なフォントによって多少異なる場合があります。正確なピクセルサイズを取得したい場合は、QFontInfoクラスやQFontMetricsクラスを使用します。


フォントサイズが適用されない/変更されない

これは最もよくある問題です。 QFontオブジェクトは値オブジェクト(value object)であり、そのオブジェクト自体を変更しても、そのフォントを使用しているウィジェットには自動的に変更が反映されません。

よくある間違いのコード例

QLabel *label = new QLabel("Hello");
// 現在のフォントを取得
QFont font = label->font();
// サイズを変更 (この時点ではlabelには反映されていない)
font.setPointSize(24);
// ここで終わりだと、labelのフォントは変更されない

トラブルシューティング

変更したQFontオブジェクトを、対象のウィジェットに再度設定する必要があります。

QLabel *label = new QLabel("Hello");
QFont font = label->font();
font.setPointSize(24);
label->setFont(font); // ★ 変更したフォントをラベルに再設定する

同様に、QTextCharFormatなどにフォントを設定する場合も、setTextCharFormat()などでフォーマットを再適用する必要があります。

setPointSize()に負の値または0を設定してしまう

setPointSize()の引数には、0より大きい値を指定する必要があります。負の値や0を設定すると、期待しない結果になったり、Qtのデバッグ出力に警告が表示されたりします。

エラーメッセージの例
QFont::setPointSize: Point size <= 0 (-1), must be greater than 0.

トラブルシューティング
フォントサイズを動的に設定する場合、必ず入力値が正であることを確認してください。例えば、ユーザー入力からサイズを設定する場合などは、値の検証を行う必要があります。

スタイルシート (QSS) との競合

Qt DesignerでUIを作成している場合や、スタイルシート (.qssファイルやQWidget::setStyleSheet()) を使用してフォントを設定している場合、コードでQFont::setPointSize()を呼び出してもスタイルシートの設定が優先されることがあります。特にスタイルシートでピクセル単位 (px) でフォントサイズを指定している場合に、setPointSize()でポイント単位 (pt) で設定しようとすると、デザイナー側でフォントサイズが-1になるなどの現象が発生することがあります。

トラブルシューティング

  • コードかスタイルシートか
    フォントサイズの設定は、コードで行うかスタイルシートで行うか、どちらかに統一することを検討してください。両方を併用すると、予期せぬ挙動につながることがあります。コードで設定したフォントをスタイルシートで上書きしてしまうことがよくあります。
  • 単位の統一
    スタイルシートを使用する場合は、pt(ポイント)単位で指定することをお勧めします。 例: font-size: 12pt;
  • スタイルシートの確認
    目的のウィジェットに適用されているスタイルシートを確認し、font-sizeプロパティが設定されていないか確認します。

OSのDPIスケーリングやシステムフォント設定の影響

setPointSize()で設定したポイントサイズは論理的なサイズですが、実際の画面上でのピクセル数や見た目の大きさは、オペレーティングシステムのDPIスケーリング設定や、OSにインストールされているフォント、Qtが使用するフォントレンダリングエンジンによって異なります。特に、異なるOS(Windows, macOS, Linux)や、高DPIディスプレイ環境でアプリケーションを実行する場合に、同じポイントサイズでも見た目が異なることがあります。

トラブルシューティング

  • QFontInfoの活用
    実際にシステムが選択したフォントの情報を取得したい場合は、QFontInfoクラスを使用します。これにより、要求したフォントが利用可能だったか、代替フォントが使われたかなどを確認できます。
  • QFontMetricsの活用
    実際のテキストの幅や高さを取得したい場合は、QFontMetricsクラスを使用します。これにより、設定したフォントで実際にテキストがどれくらいの領域を占めるかを計算し、レイアウト調整に役立てることができます。
  • デバイス独立性
    setPointSize()はデバイス独立性を保つための良い方法ですが、厳密なピクセル単位の制御が必要な場合は、QFont::setPixelSize()を使用することも検討します。ただし、これはデバイス依存のコードになるため、DPIスケーリングなどに対応するための追加の考慮が必要です。

const QFontオブジェクトの変更

関数の引数としてconst QFont&が渡された場合など、定数参照のQFontオブジェクトに対してsetPointSize()を呼び出すことはできません。

エラーメッセージの例
'void QFont::setPointSize(int)' : cannot convert 'this' pointer from 'const QFont' to 'QFont &'

トラブルシューティング
const修飾子を外し、変更可能なQFontオブジェクトを操作するようにしてください。関数内でフォントを変更する場合は、QFontオブジェクトをコピーしてから変更を適用します。

void updateLabelFont(QLabel *label) {
    // label->font() は QFont を値で返すため、直接変更はできない
    // 正しい方法: 一度 QFont オブジェクトにコピーしてから変更し、再度設定する
    QFont font = label->font();
    font.setPointSize(24);
    label->setFont(font);
}


QLabel のフォントサイズを変更する

最も基本的な例として、QLabel (テキスト表示ウィジェット) のフォントサイズを変更する方法です。

#include <QApplication> // QApplicationはQtアプリケーションの開始に必要
#include <QLabel>         // QLabelはテキストを表示するウィジェット
#include <QFont>          // QFontはフォントの設定に使用

int main(int argc, char *argv[]) {
    QApplication app(argc, argv); // QApplicationオブジェクトを初期化

    // QLabelを作成し、テキストを設定
    QLabel *label = new QLabel("Hello, Qt!");

    // 現在のラベルのフォントを取得
    // QFontオブジェクトは「値」で返されるため、コピーして操作する必要があります。
    QFont font = label->font();

    // フォントサイズを24ポイントに設定
    font.setPointSize(24);

    // フォントを太字に設定 (オプション)
    font.setBold(true);

    // 変更したフォントをラベルに再設定
    // これを忘れると、フォントの変更は反映されません!
    label->setFont(font);

    // ウィジェットを表示
    label->show();

    // アプリケーションのイベントループを開始
    return app.exec();
}

解説

  1. QLabel *label = new QLabel("Hello, Qt!");
    • "Hello, Qt!" というテキストを持つ QLabel オブジェクトを作成します。
  2. QFont font = label->font();
    • label->font() を呼び出すことで、現在 label に設定されているフォントのコピーを取得します。QFont は値型なので、直接 label->font().setPointSize(24); のようにしても、元のラベルのフォントには変更が反映されません。必ず一度 QFont オブジェクトにコピーする必要があります。
  3. font.setPointSize(24);
    • 取得した font オブジェクトのサイズを24ポイントに設定します。
  4. font.setBold(true);
    • フォントを太字に設定します。(setPointSize() とは直接関係ありませんが、フォント設定の一般的な例です。)
  5. label->setFont(font);
    • 変更を加えた font オブジェクトを再び label に設定します。このステップが最も重要で、これを忘れると変更が画面に反映されません。

QPushButton のフォントサイズを変更する

QLabel と同様に、他のウィジェットでもフォントサイズを変更できます。

#include <QApplication>
#include <QPushButton> // QPushButtonはボタンウィジェット
#include <QFont>

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

    QPushButton *button = new QPushButton("Click Me!");
    button->setFixedSize(200, 100); // ボタンのサイズを固定

    QFont buttonFont = button->font();
    buttonFont.setPointSize(18); // サイズを18ポイントに設定
    buttonFont.setItalic(true);  // イタリックに設定 (オプション)
    button->setFont(buttonFont); // ボタンにフォントを適用

    button->show();

    return app.exec();
}

アプリケーション全体でデフォルトのフォントサイズを設定したい場合は、QApplication::setFont() を使用します。これにより、明示的にフォントを設定しないすべてのウィジェットに適用されます。

#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QFont>
#include <QVBoxLayout> // レイアウト管理
#include <QWidget>     // 基本ウィジェット

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

    // アプリケーション全体のデフォルトフォントを設定
    QFont defaultAppFont;
    defaultAppFont.setFamily("Arial"); // フォントファミリーを設定
    defaultAppFont.setPointSize(16);   // デフォルトサイズを16ポイントに設定
    app.setFont(defaultAppFont);

    // ウィジェットを作成 (ここではフォントを明示的に設定しない)
    QLabel *label1 = new QLabel("これはデフォルトフォントです");
    QPushButton *button1 = new QPushButton("ボタン1");

    // 一部のウィジェットのフォントを上書きする例
    QLabel *label2 = new QLabel("このラベルは異なるフォントです");
    QFont customFont = label2->font(); // 現在のフォント (デフォルト) を取得
    customFont.setPointSize(12);       // サイズを12ポイントに変更
    customFont.setUnderline(true);     // 下線を引く
    label2->setFont(customFont);       // カスタムフォントを適用

    // レイアウトを作成し、ウィジェットを追加
    QWidget *window = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(window);
    layout->addWidget(label1);
    layout->addWidget(button1);
    layout->addWidget(label2);

    window->setWindowTitle("フォントサイズ例");
    window->show();

    return app.exec();
}
  1. app.setFont(defaultAppFont);
    • この行が実行されると、その後に作成されるウィジェットの多くは、特にフォントが指定されない限り、この defaultAppFont を継承します。
  2. label2 の例では、label2->font() でデフォルトフォントを取得し、それをベースにsetPointSize() でサイズを変更しています。これにより、特定のウィジェットのみデフォルトとは異なるフォントを設定できます。


QFont::setPixelSize()

setPointSize() が論理的なポイント単位でサイズを設定するのに対し、setPixelSize()ピクセル単位でフォントサイズを設定します。

  • 使い分け

    • UI要素の厳密なピクセルアライメントが必要な場合。
    • 特定の画像やグラフィックに合わせてテキストサイズを調整する場合。
    • ただし、DPIスケーリングへの対応は開発者が考慮する必要があります。
  • 使用例

    #include <QApplication>
    #include <QLabel>
    #include <QFont>
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QLabel *label = new QLabel("Hello, Pixel Size!");
        QFont font = label->font();
        font.setPixelSize(36); // フォントサイズを36ピクセルに設定
        label->setFont(font);
        label->show();
    
        return app.exec();
    }
    
    • デバイスのピクセルに直接対応するため、厳密なピクセル単位での表示制御が必要な場合に適しています。
    • DPI (Dots Per Inch) スケーリングの影響を直接受けます。つまり、高DPIディスプレイでは、同じピクセルサイズでも物理的な大きさが小さく見える可能性があります。
    • クロスプラットフォームでの見た目の一貫性という点では、setPointSize() よりも劣る場合があります。

Qt Style Sheets (QSS)

Qt のスタイルシート (CSSに似た構文) を使用して、ウィジェットのフォントサイズを設定できます。これは、UIの見た目をコードから分離し、テーマ設定や動的なスタイリングを可能にする強力な方法です。

  • 使い分け

    • UIの見た目を柔軟に制御したい場合。
    • デザイナーとの共同作業や、UIテーマの切り替え機能が必要な場合。
    • アプリケーションのスタイルを一元的に管理したい場合。
  • 使用例 (外部ファイルから読み込む場合)
    styles.qss ファイル:

    QLabel {
        font-size: 18pt;
        color: green;
    }
    
    QPushButton {
        font-size: 16px;
        background-color: lightgray;
    }
    
    #mySpecialLabel { /* QLabelのobjectNameが"mySpecialLabel"の場合 */
        font-size: 24pt;
        font-weight: bold;
    }
    

    C++コード:

    // ... (QApplicationの初期化など)
    QFile file("styles.qss");
    if (file.open(QFile::ReadOnly | QFile::Text)) {
        QString styleSheet = QLatin1String(file.readAll());
        app.setStyleSheet(styleSheet);
        file.close();
    }
    
    // ... (ウィジェットの作成と表示)
    QLabel *specialLabel = new QLabel("特別なラベル");
    specialLabel->setObjectName("mySpecialLabel"); // IDを設定
    // ...
    
  • 使用例 (コード内で設定する場合)

    #include <QApplication>
    #include <QLabel>
    #include <QPushButton>
    #include <QVBoxLayout>
    #include <QWidget>
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        QWidget *window = new QWidget();
        QVBoxLayout *layout = new QVBoxLayout(window);
    
        QLabel *label1 = new QLabel("スタイルシートで20pt");
        QLabel *label2 = new QLabel("スタイルシートで16px");
        QPushButton *button1 = new QPushButton("ボタンのフォント");
    
        // ウィジェットごとにスタイルシートを設定
        label1->setStyleSheet("font-size: 20pt; color: blue;");
        label2->setStyleSheet("font-size: 16px; font-weight: bold;");
        button1->setStyleSheet("font-family: 'Times New Roman'; font-size: 14pt;");
    
        // アプリケーション全体にスタイルシートを設定することも可能
        // app.setStyleSheet("QLabel { font-size: 18pt; }");
    
        layout->addWidget(label1);
        layout->addWidget(label2);
        layout->addWidget(button1);
    
        window->setWindowTitle("QSSフォントサイズ例");
        window->show();
    
        return app.exec();
    }
    
  • 特徴

    • 宣言的
      コードとは別にUIの見た目を定義できます。
    • 柔軟性
      特定のウィジェット、ウィジェットのクラス、ID、プロパティなどに基づいてスタイルを適用できます。
    • テーマ設定
      アプリケーション全体の見た目を簡単に変更できます。
    • フォントサイズは pt (ポイント) または px (ピクセル) 単位で指定できます。

QFontDatabase は、システムにインストールされているフォントや、アプリケーションに組み込んだカスタムフォントを管理するためのクラスです。QFontDatabase::font() メソッドを使用すると、フォントのID (ファミリー名、スタイルなど) を指定して QFont オブジェクトを取得できます。

  • 使い分け

    • 特定のフォントファミリーとスタイルを厳密に指定したい場合。
    • アプリケーションにカスタムフォントをバンドルして使用したい場合。
  • 使用例

    #include <QApplication>
    #include <QLabel>
    #include <QFont>
    #include <QFontDatabase> // QFontDatabaseを使用
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
    
        // 例: カスタムフォントをアプリケーションに追加する場合
        // int id = QFontDatabase::addApplicationFont(":/fonts/MyCustomFont.ttf");
        // QString family = QFontDatabase::applicationFontFamilies(id).at(0);
    
        QLabel *label = new QLabel("QFontDatabaseでフォントサイズ");
        QFont font = QFontDatabase::systemFont(QFontDatabase::GeneralFont); // システムの一般的なフォントを取得
        // または QFont font(family, 18); // カスタムフォントの場合
    
        font.setPointSize(22); // サイズを設定
        label->setFont(font);
        label->show();
    
        return app.exec();
    }
    
  • 特徴

    • 特定のフォントファミリーとスタイルを組み合わせて指定できます。
    • カスタムフォントをアプリケーションに埋め込み、そのフォントを使用する場合に特に便利です。
  • QFontDatabase
    特定のフォントファミリーやカスタムフォントをIDで指定したい場合。
  • Qt Style Sheets (QSS)
    UIの見た目を宣言的に制御し、スタイルとロジックを分離したい場合。柔軟なスタイリングやテーマ設定に最適です。
  • QFont::setPixelSize()
    厳密なピクセル単位での制御が必要な場合。DPIスケーリングを意識する必要があります。
  • QFont::setPointSize()
    最も一般的で、デバイス独立なフォントサイズ設定。ほとんどのケースで推奨されます。