Qt QFontのよくあるエラーと解決策:フォント表示トラブルを乗り越える
QFont (クラス) とは
QFont
クラスは、Qtアプリケーションで使用されるフォントの属性をカプセル化するクラスです。言い換えれば、文字の見た目(書体、サイズ、太さ、斜体など)を定義するためのものです。
主な機能と役割
-
フォントファミリー(書体)の指定:
- 例: "Arial", "Meiryo UI", "Times New Roman" など、具体的な書体を指定します。
setFamily()
メソッドを使用します。
-
フォントサイズの設定:
- 文字の大きさを指定します。通常はポイント (point) またはピクセル (pixel) で指定します。
setPointSize()
やsetPixelSize()
メソッドを使用します。
-
ウェイト(太さ)の設定:
- 文字の太さを指定します。標準、太字、極太などがあります。
setWeight()
メソッドを使用します。QFont::Normal
,QFont::Bold
,QFont::Light
などの定義済み定数があります。
-
イタリック(斜体)の設定:
- 文字を斜体にするかどうかを指定します。
setItalic()
メソッドを使用します。
-
アンダーライン(下線)の設定:
- 文字に下線を引くかどうかを指定します。
setUnderline()
メソッドを使用します。
-
ストライクアウト(打ち消し線)の設定:
- 文字に打ち消し線を引くかどうかを指定します。
setStrikeOut()
メソッドを使用します。
-
伸縮(ストレッチ)の設定:
- フォントの幅を伸縮させることができます。
setStretch()
メソッドを使用します。
使用例
Qtアプリケーションでウィジェット(例: QLabel
, QPushButton
, QTextEdit
など)に特定のフォントを設定する場合によく使用されます。
#include <QApplication>
#include <QLabel>
#include <QFont>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hello, Qt with custom font!");
// QFontオブジェクトを作成
QFont font;
// フォントファミリーを設定
font.setFamily("Meiryo UI"); // Windowsの例
// font.setFamily("Arial"); // 多くの環境で利用可能
// フォントサイズを設定 (ポイント単位)
font.setPointSize(24);
// 太字に設定
font.setWeight(QFont::Bold);
// 斜体に設定
font.setItalic(true);
// 下線に設定
font.setUnderline(true);
// ラベルにフォントを設定
label.setFont(font);
label.show();
return app.exec();
}
この例では、QLabel
に「Meiryo UI」フォントでサイズ24pt、太字、斜体、下線が適用されたテキストが表示されます。
- リソースの最適化: Qtはフォントのリソースを効率的に管理し、必要なフォント情報のみをロードするように最適化されています。
- プラットフォームの抽象化: OSによってフォントの扱いは異なりますが、
QFont
を使うことでQtがその差異を吸収し、どのプラットフォームでも同じようにフォントを扱えるようになります。 - 統一的なフォント管理: アプリケーション全体で一貫性のあるフォントを使用するための中心的な仕組みを提供します。
QFont (クラス) に関連する一般的なエラーとトラブルシューティング
QFont
はフォントの設定を行うための重要なクラスですが、意図しない挙動やエラーに遭遇することもあります。ここでは、よくある問題とその対処法をいくつかご紹介します。
指定したフォントが適用されない、または代替フォントが使われる
考えられる原因
- Qtバージョン間の非互換性: 特に
QFont::setWeight()
など、Qtのバージョンアップで引数の型や推奨値が変更された場合。 - ウィジェットの継承: 親ウィジェットのフォント設定が子ウィジェットに継承されず、デフォルトフォントが適用されている場合(ただし、通常は継承されます)。
- スタイルの競合: スタイルシート (
.qss
ファイルやsetStyleSheet()
) でフォントが設定されており、プログラムで設定したQFont
が上書きされている場合。 - フォントファイルの読み込み失敗: アプリケーションにカスタムフォントを埋め込んでいる(リソースファイルなど)が、その読み込みに失敗している場合。
- スペルミス: フォントファミリー名にスペルミスがある場合。
- フォントが存在しない: 指定したフォントファミリー(書体名)が、アプリケーションを実行しているシステムにインストールされていない場合。
トラブルシューティング
- Qtバージョン特有の変更:
- 特にQt5からQt6への移行では、
QFont::setWeight()
の引数型がint
からQFont::Weight
列挙型に変更されています。古いコードを移植する際は注意が必要です。
- 特にQt5からQt6への移行では、
QFont
のコピーまたは参照:QLabel::setFont(QFont*&)
のようなエラーが出る場合、QLabel::setFont(const QFont&)
が期待されているのにポインタを渡している可能性があります。setFont(*font)
のようにデリファレンスするか、QFont
オブジェクトを直接渡してください。
- スタイルシートの確認:
- 該当するウィジェットやその親にスタイルシートが適用されていないか確認します。スタイルシートは、
setFont()
よりも優先されることが多いです。 - Qt Designer を使用している場合は、プロパティエディタで
font
プロパティが設定されていないか確認します。
- 該当するウィジェットやその親にスタイルシートが適用されていないか確認します。スタイルシートは、
- カスタムフォントの確認:
QFontDatabase::addApplicationFont()
が-1
以外の値を返しているか確認します。-1
の場合は、フォントファイルのパスが間違っているか、ファイルが破損している可能性があります。- リソースファイル (
.qrc
) を使用している場合は、Q_INIT_RESOURCE()
を適切に呼び出しているか確認します。
- フォント名の確認:
- システムに実際にそのフォントがインストールされているか確認します。
QFontDatabase::families()
を使って、システムで利用可能なフォントファミリーのリストを取得し、正しい名前を使用しているか確認します。QFont::defaultFamily()
やQFont::actualFamily()
で、実際に使用されているフォントファミリーを確認できます。
フォントサイズがおかしい、または解像度によって表示が異なる
考えられる原因
- ポイントとピクセル: フォントサイズを
setPointSize()
(ポイント単位) とsetPixelSize()
(ピクセル単位) のどちらで指定したかによって、表示が異なることがあります。通常、DPIスケーリングに適切に対応するためにはsetPointSize()
の使用が推奨されます。 - DPIスケーリング: Windowsなどの高DPI(高解像度)ディスプレイ環境で、DPIスケーリング設定が原因でフォントサイズが想定通りにならないことがあります。
トラブルシューティング
setPointSize()
の使用:- 一貫したサイズの表示のためには、
setPointSize()
を使用し、QtにDPIスケーリングを任せるのが一般的です。
- 一貫したサイズの表示のためには、
- DPIスケーリングの調整:
- アプリケーションの起動時に
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
やQApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
(Qt 5の場合)を設定してみます。 - Qt 6以降では、デフォルトでHigh DPIに対応しているため、これらの属性は不要な場合があります。
- 環境変数
QT_SCALE_FACTOR
やQT_FONT_DPI
を設定して、DPIスケーリングの挙動を調整することも可能です。
- アプリケーションの起動時に
特殊な文字(絵文字、特定の記号など)が表示されない、または「豆腐」になる
考えられる原因
- エンコーディングの問題: テキストデータのエンコーディングと、Qtがテキストを解釈する際のエンコーディングが一致していない場合。
- フォントが文字をサポートしていない: 使用しているフォントが、表示しようとしている特定の文字(特に多言語の文字や絵文字など)をグリフとして持っていない場合。
トラブルシューティング
- QStringの適切な使用:
- テキストデータは常に
QString
で扱い、UTF-8
などの適切なエンコーディングで読み込み/書き込みが行われていることを確認します。
- テキストデータは常に
- フォールバックフォント:
- Qtは通常、指定されたフォントに特定の文字がない場合、システムで利用可能な代替フォント(フォールバックフォント)を自動的に探して表示しようとします。しかし、それが常にうまくいくとは限りません。
- フォントの変更:
- その文字セットをサポートしている別のフォント(例: "Segoe UI Emoji" (Windows), "Apple Color Emoji" (macOS), "Noto Color Emoji" (Linux) など)を試します。
QPainterでのsetFont()が効果がない
考えられる原因
- 無効な
QFont
インスタンス:QFont::fromString()
などで文字列からフォントを生成しようとしたが、その文字列が正しくないために無効なQFont
インスタンスが作成された場合。 paint()
メソッドの呼び出しタイミング:QGraphicsItem
のpaint()
メソッドなどでQPainter::setFont()
を呼び出しても、その後に描画されるテキストが影響を受けない場合があります。これは、QPainter
の状態がリセットされたり、別の描画操作によって上書きされたりするためです。
トラブルシューティング
- 描画順序の確認:
setFont()
を呼び出した後に、実際にテキスト描画のメソッド(例:drawText()
)が呼び出されているか確認します。
QFont
インスタンスの有効性確認:QFont::fromString()
などで生成したQFont
オブジェクトがisValid()
を返すか確認します。無効な場合は、フォント文字列の形式が正しいか再確認してください。
QPainter
の状態管理:QPainter::save()
とQPainter::restore()
を使って、フォント設定を含むQPainter
の状態を保存・復元することを検討します。
Qt Designerでフォント設定ができない、または保存されない
考えられる原因
- スタイルシートとの競合: Designerで設定したフォントが、後から適用されるスタイルシートによって上書きされている。
- Qt Designerのバグ: 特定のQtバージョンやDesignerのバージョンで、フォント設定に関するバグがある可能性があります。
トラブルシューティング
- 手動での設定: Designerでの設定がうまくいかない場合、コード内で直接
setFont()
を呼び出すことで対処します。 - QSSの確認: 生成されたUIファイル(
.ui
)や、アプリケーションコードで読み込まれるスタイルシートに、意図しないフォント設定がないか確認します。 - Designerの再起動: 一時的な問題であれば、Qt Designerを再起動することで解決することがあります。
アプリケーションが起動しない、「Unable to enumerate family...」エラー
考えられる原因
- 特定のフォントの問題: 特定のフォント(特にサードパーティ製や破損したフォント)がシステムに存在する場合、Qtがそのフォントを列挙しようとして問題が発生することがあります。
- フォントキャッシュの破損: Qtのフォントキャッシュが破損している場合。
- 問題のフォントの特定と削除:
- エラーメッセージに特定のフォント名が表示されている場合、そのフォントをシステムから一時的に削除して試してみる。
- フォントキャッシュのクリア:
- OSのフォントキャッシュをクリアしたり、Qtの内部キャッシュ(一時ファイルなど)を削除してみる。
- 公式ドキュメントとフォーラム: Qtの公式ドキュメントやQt Forum、Stack Overflowなどで同様の問題が報告されていないか検索します。
- 最小限の再現コード: 問題が発生しているコードを最小限に切り出し、シンプルに再現できるコードを作成してみます。これにより、問題の原因を絞り込みやすくなります。
- デバッガの使用: デバッガを使用して、
QFont
オブジェクトが期待通りの状態(family()
,pointSize()
,weight()
など)になっているかを確認します。 - エラーメッセージの確認: コンソールやログに表示されるエラーメッセージを注意深く読みます。Qtは比較的親切なエラーメッセージを出すことが多いです。
Qt アプリケーションでフォントを設定する最も一般的な方法は、QFont
オブジェクトを作成し、その属性を設定し、その後ウィジェットに適用することです。
基本的なフォント設定
これは最も基本的なフォント設定の例です。フォントファミリー、サイズ、太字、斜体を設定しています。
#include <QApplication>
#include <QLabel>
#include <QFont> // QFont を使うために必要
int main(int argc, char *argv[])
{
QApplication app(argc, argv); // QApplication オブジェクトの作成
QLabel label("Hello, カスタムフォント!"); // テキストを表示する QLabel を作成
// QFont オブジェクトを作成
QFont font;
// フォントファミリー(書体)を設定
// システムにインストールされているフォント名を使用します。
// Windowsでは"Meiryo UI", macOSでは"Hiragino Sans", Linuxでは"Noto Sans CJK JP"などが一般的です。
// 存在しないフォント名を指定すると、システムが代替フォントを選択します。
font.setFamily("Meiryo UI");
// フォントサイズをポイント単位で設定
font.setPointSize(20);
// フォントの太さを設定 (QFont::Normal, QFont::Bold など)
font.setWeight(QFont::Bold);
// 斜体(イタリック)に設定
font.setItalic(true);
// 下線(アンダーライン)に設定
font.setUnderline(true);
// ウィジェット(QLabel)にフォントを適用
label.setFont(font);
// ラベルのサイズをテキストに合わせて調整
label.adjustSize();
label.show(); // ラベルを表示
return app.exec(); // アプリケーションのイベントループを開始
}
解説:
label.adjustSize();
は、テキストのサイズに合わせてラベルの大きさを自動調整するのに役立ちます。- 最後に
label.setFont(font);
で、作成したQFont
オブジェクトをQLabel
に適用しています。 setFamily()
,setPointSize()
,setWeight()
,setItalic()
,setUnderline()
といったメソッドを使って、フォントの各属性を設定します。QFont font;
でQFont
オブジェクトをデフォルトコンストラクタで作成します。
コンストラクタでフォントを設定する
QFont
オブジェクトは、コンストラクタで初期値を設定することもできます。
#include <QApplication>
#include <QPushButton>
#include <QFont>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// コンストラクタでフォントファミリー、サイズ、太さ、斜体を一度に設定
// QFont("フォントファミリー", サイズ, 太さ, 斜体か)
QFont buttonFont("Arial", 16, QFont::DemiBold, false);
QPushButton button("クリックしてください");
button.setFont(buttonFont); // ボタンにフォントを適用
button.adjustSize(); // ボタンのサイズをテキストに合わせて調整
button.show();
return app.exec();
}
解説:
QFont::DemiBold
はQFont::Normal
とQFont::Bold
の中間くらいの太さを示します。QFont buttonFont("Arial", 16, QFont::DemiBold, false);
のように、コンストラクタで複数の属性を一度に設定できます。
利用可能なフォントを列挙する (QFontDatabase の利用)
システムにインストールされているフォントを調べて、ユーザーに選択肢として提示するなどの場合に便利です。
#include <QApplication>
#include <QComboBox>
#include <QFontDatabase> // QFontDatabase を使うために必要
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QComboBox *fontComboBox = new QComboBox(&window);
QLabel *sampleLabel = new QLabel("このテキストのフォントが変わります。", &window);
sampleLabel->setFont(QFont("Arial", 18)); // 初期フォントを設定
// QFontDatabase を使用して、システムで利用可能なフォントファミリーを取得
QStringList fontFamilies = QFontDatabase::families();
fontComboBox->addItems(fontFamilies); // コンボボックスにフォント名を追加
// コンボボックスの選択が変更されたら、ラベルのフォントを更新
QObject::connect(fontComboBox, &QComboBox::currentTextChanged,
[=](const QString &family) {
QFont currentFont = sampleLabel->font(); // 現在のフォントを取得
currentFont.setFamily(family); // ファミリー名のみ変更
sampleLabel->setFont(currentFont); // 新しいフォントを適用
sampleLabel->adjustSize(); // サイズ調整
});
layout->addWidget(fontComboBox);
layout->addWidget(sampleLabel);
window.setLayout(layout);
window.setWindowTitle("フォント選択の例");
window.show();
return app.exec();
}
解説:
currentTextChanged
シグナルをラムダ式で接続し、選択されたフォントファミリー名でQLabel
のフォントを更新しています。QComboBox
にこれらのフォント名を追加し、ユーザーが選択できるようにしています。QFontDatabase::families()
は、システムにインストールされているすべてのフォントファミリー名を含むQStringList
を返します。
カスタムフォントをアプリケーションに埋め込む
外部のフォントファイル(例: .ttf
, .otf
)をアプリケーションに含め、システムにインストールされていなくても利用できるようにする方法です。これは、特定のデザイン要件がある場合や、独自のフォントを使用したい場合に便利です。
ステップ 1: リソースファイル (.qrc
) の作成
プロジェクトに新しいQtリソースファイルを追加し、フォントファイル(例: MyCustomFont.ttf
)をリソースに追加します。例えば、fonts
というプレフィックスを付けて追加したとします。
myfonts.qrc
:
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/fonts">
<file>MyCustomFont.ttf</file>
</qresource>
</RCC>
ステップ 2: C++ コードでフォントを読み込む
#include <QApplication>
#include <QLabel>
#include <QFont>
#include <QFontDatabase> // QFontDatabase を使うために必要
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// アプリケーション起動時にカスタムフォントをロード
// ":/fonts/MyCustomFont.ttf" は .qrc ファイルで指定したパス
int fontId = QFontDatabase::addApplicationFont(":/fonts/MyCustomFont.ttf");
QStringList fontFamilies;
if (fontId != -1) {
fontFamilies = QFontDatabase::applicationFontFamilies(fontId);
qDebug() << "カスタムフォントが正常にロードされました:" << fontFamilies;
} else {
qWarning() << "カスタムフォントのロードに失敗しました!";
}
QLabel label("Hello, Custom Font!");
QFont font;
if (!fontFamilies.isEmpty()) {
font.setFamily(fontFamilies.at(0)); // ロードしたフォントファミリー名を設定
font.setPointSize(24);
label.setFont(font);
} else {
label.setText("カスタムフォントのロードに失敗しました。");
font.setFamily("Arial"); // 代替フォント
font.setPointSize(18);
label.setFont(font);
}
label.adjustSize();
label.show();
return app.exec();
}
解説:
- 取得したファミリー名を
setFont()
で設定することで、埋め込みフォントを使用できます。 QFontDatabase::applicationFontFamilies(fontId)
で、ロードしたフォントのファミリー名を取得できます。通常、フォントファイルには複数のファミリー名が含まれている場合があります。- この関数は、ロードしたフォントのIDを返します。ロードに失敗した場合は
-1
を返します。 QFontDatabase::addApplicationFont()
を使用して、リソース (.qrc
ファイル) からフォントファイルをロードします。
QFont
クラスはQtにおけるフォント設定の中心ですが、特定の使用例や要件に応じて、他のアプローチや補助的なQt機能が使われることがあります。
Qt Style Sheets (QSS) を使用する方法
QFont
をC++コードで直接操作する代わりに、CSS(Cascading Style Sheets)に似たQt Style Sheets(QSS)を使ってフォントを設定できます。これは、UIの見た目を分離し、デザインをコードから独立させたい場合に非常に強力な方法です。
特徴
- デザインとコードの分離: デザイナーがQSSファイルを編集するだけで、開発者はコードを変更する必要がありません。
- 柔軟性: アプリケーション全体、特定のウィジェット、特定のクラス名を持つウィジェットなど、適用範囲を細かく制御できます。
- 宣言的: スタイルシートは、特定のウィジェットやウィジェットの種類に対してフォント設定を宣言的に記述します。
コード例
#include <QApplication>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QLabel *label1 = new QLabel("QSSで設定されたラベル", &window);
QPushButton *button1 = new QPushButton("QSSで設定されたボタン", &window);
QLabel *label2 = new QLabel("コードで設定されたラベル", &window);
// 1. アプリケーション全体にスタイルシートを適用
// アプリケーション内のすべてのQLabelとQPushButtonにフォントを設定
app.setStyleSheet(
"QLabel { font: italic 20pt 'メイリオ UI'; color: blue; }" // QLabelのスタイル
"QPushButton { font: bold 16pt 'Arial'; color: white; background-color: #4CAF50; border-radius: 5px; }" // QPushButtonのスタイル
);
// 2. 個別のウィジェットにスタイルシートを適用 (setFont() よりも優先される)
label1->setStyleSheet("font: 24pt 'Times New Roman'; color: red;");
// 3. QFont::setFont() で直接設定 (QSSの特定性ルールによっては上書きされる)
QFont font("游ゴシック", 14, QFont::Normal);
label2->setFont(font);
layout->addWidget(label1);
layout->addWidget(button1);
layout->addWidget(label2);
window.setLayout(layout);
window.setWindowTitle("QSSフォントの例");
window.show();
return app.exec();
}
解説
- 優先順位: 一般的に、より具体的なスタイルシート(例: 個別のウィジェットに適用されたもの)は、より一般的なスタイルシート(例: アプリケーション全体に適用されたもの)よりも優先されます。そして、QSSは通常、
setFont()
でコードで設定されたフォントよりも優先されます。 - QSSは
font
プロパティを使ってフォントファミリー、サイズ、スタイル(italic, bold)、太さを指定します。 label1->setStyleSheet()
のように、個別のウィジェットにもスタイルシートを適用できます。app.setStyleSheet()
を使ってアプリケーション全体にスタイルシートを適用しています。
QFontDialog を使用する方法
ユーザーにフォントの選択肢を提供し、GUIを通じてフォントを設定させたい場合に QFontDialog
が非常に便利です。
特徴
- ユーザー制御: ユーザーがフォントファミリー、スタイル、サイズなどを自由に選択できます。
- 標準的なUI: OSの標準的なフォント選択ダイアログを表示するため、ユーザーにとって馴染みやすいインターフェースを提供します。
コード例
#include <QApplication>
#include <QMainWindow>
#include <QTextEdit>
#include <QMenuBar>
#include <QAction>
#include <QFontDialog> // QFontDialog を使うために必要
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QMainWindow mainWindow;
QTextEdit *textEdit = new QTextEdit(&mainWindow);
mainWindow.setCentralWidget(textEdit);
QMenuBar *menuBar = mainWindow.menuBar();
QMenu *formatMenu = menuBar->addMenu("フォーマット");
QAction *chooseFontAction = formatMenu->addAction("フォントの選択...");
// 「フォントの選択...」アクションがトリガーされたら、フォントダイアログを表示
QObject::connect(chooseFontAction, &QAction::triggered, [&]() {
bool ok;
// 現在のテキストエディタのフォントを初期値としてダイアログを開く
QFont font = QFontDialog::getFont(&ok, textEdit->font(), &mainWindow);
if (ok) {
// ユーザーがOKを押した場合、テキストエディタのフォントを更新
textEdit->setFont(font);
}
});
mainWindow.setWindowTitle("QFontDialogの例");
mainWindow.resize(400, 300);
mainWindow.show();
return app.exec();
}
解説
- ユーザーがフォントを選択して「OK」を押した場合、返された
QFont
オブジェクトをQTextEdit
に適用しています。 - 3番目の引数は親ウィジェットです。
- 2番目の引数はダイアログの初期フォントです。
- 最初の引数 (
&ok
) はユーザーが「OK」を押したか「キャンセル」を押したかを返します。 QFontDialog::getFont()
静的メソッドを使って、フォント選択ダイアログを表示します。
QFontMetrics を使用する方法
QFontMetrics
クラスは、特定の QFont
を使用してテキストを描画したときの寸法情報(幅、高さ、行間など)を提供します。これは、テキストのレイアウトを正確に制御したり、描画領域を計算したりする場合に非常に重要です。
特徴
- レイアウトの計算: テキストが占めるスペースを事前に知ることで、UI要素の正確な配置に役立ちます。
- テキストの測定: 指定したフォントで描画されるテキストのピクセル単位のサイズを計算します。
コード例
#include <QApplication>
#include <QLabel>
#include <QFont>
#include <QFontMetrics> // QFontMetrics を使うために必要
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QLabel *label = new QLabel("テキストの幅と高さを測定します。", &window);
QFont font("Arial", 20, QFont::Bold);
label->setFont(font);
// QFontMetrics オブジェクトを、測定したいフォントから作成
QFontMetrics fontMetrics(font);
QString text = "テキストの幅と高さを測定します。";
// テキストのピクセル幅を測定
int textWidth = fontMetrics.horizontalAdvance(text);
// テキストのピクセル高さを測定
int textHeight = fontMetrics.height();
qDebug() << "フォント:" << font.family() << " サイズ:" << font.pointSize();
qDebug() << "テキスト: '" << text << "'";
qDebug() << "幅 (pixels):" << textWidth;
qDebug() << "高さ (pixels):" << textHeight;
qDebug() << "行の高さ (leading込み):" << fontMetrics.lineSpacing();
qDebug() << "ベースラインからの上方向の高さ (ascent):" << fontMetrics.ascent();
qDebug() << "ベースラインからの下方向の高さ (descent):" << fontMetrics.descent();
// QLabelの推奨サイズを測定したテキストの幅と高さに基づいて設定
label->setFixedSize(textWidth + 10, textHeight + 10); // 少し余白を追加
layout->addWidget(label);
window.setLayout(layout);
window.setWindowTitle("QFontMetricsの例");
window.show();
return app.exec();
}
解説
- これらの情報を使って、
QLabel
のサイズを動的に設定しています。 ascent()
とdescent()
は、ベースラインからの上方向と下方向の距離を返します。lineSpacing()
は複数行のテキストにおける行間を含んだ行の高さを返します。height()
はフォントの高さ(通常はアセントとディセントの合計)を返します。horizontalAdvance(text)
はテキストのピクセル幅を返します。QFontMetrics fontMetrics(font);
で、特定のフォントに対応するQFontMetrics
オブジェクトを作成します。
QPainter でのフォント設定
QPainter
を使ってカスタムウィジェットに直接描画する場合、QPainter::setFont()
を使ってその描画コンテキストでのフォントを設定します。
特徴
- 描画コンテキスト:
QPainter
オブジェクトが有効な間のみ、そのフォント設定が適用されます。 - 低レベル描画: ウィジェットの
paintEvent()
などで、グラフィック要素とともにテキストを直接描画する場合に必要です。
コード例
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QFont>
class CustomWidget : public QWidget
{
public:
CustomWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setFixedSize(300, 150);
}
protected:
void paintEvent(QPaintEvent *event) override
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // アンチエイリアス有効化
// 描画するフォントを設定
QFont customFont("Comic Sans MS", 28, QFont::ExtraBold);
painter.setFont(customFont);
// テキストの色を設定
painter.setPen(Qt::darkCyan);
// テキストを描画
painter.drawText(50, 80, "カスタム描画!");
// 別のフォントと色で別のテキストを描画
QFont anotherFont("Times New Roman", 16);
painter.setFont(anotherFont);
painter.setPen(Qt::darkRed);
painter.drawText(50, 120, "Qt Painterを使う");
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CustomWidget widget;
widget.setWindowTitle("QPainterでのフォント設定");
widget.show();
return app.exec();
}
drawText()
メソッドで、設定されたフォントとペンでテキストが描画されます。painter.setFont(customFont);
を使って、そのQPainter
が描画するテキストのフォントを設定します。paintEvent()
メソッド内でQPainter
オブジェクトを作成します。