QFont::bold()
QtプログラミングにおけるQFont::bold()
は、QFont
オブジェクトが現在、太字の設定になっているかどうかを調べるための関数です。
具体的には、以下の特徴があります。
- 関連関数:
setBold(bool enable)
: フォントを太字にするか、通常(太字ではない)にするかを設定します。enable
がtrue
の場合、フォントのウェイトはQFont::Bold
に設定され、false
の場合はQFont::Normal
に設定されます。weight()
: フォントのウェイト(太さ)を数値で取得します。QFont::bold()
はこのweight()
の値がQFont::Normal
より大きいかどうかをチェックして結果を返します。QFontInfo::bold()
: 実際に表示されるフォントが太字かどうかを調べたい場合は、QFontInfo
クラスのbold()
関数を使用します。QFont
オブジェクトに設定した太字設定が、システムにインストールされているフォントで実際に適用されるかどうかは、QFontInfo
で確認できます。
- 用途:
- 現在設定されているフォントの太字の状態を確認したい場合に使用します。
- 例えば、ユーザーインターフェースでフォントの太字状態をトグル表示する際に、現在の状態を取得するために使われます。
- 戻り値:
bool
型を返します。true
:フォントが太字(QFont::Weight
がQFont::Normal
よりも大きい値)に設定されている場合。false
:フォントが太字に設定されていない場合。
#include <QApplication>
#include <QFont>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
// 通常のフォント
QFont font1("Arial", 12);
QLabel *label1 = new QLabel("これは通常のフォントです。", &window);
label1->setFont(font1);
layout->addWidget(label1);
qDebug() << "Font 1 is bold:" << font1.bold(); // false を出力
// 太字のフォント
QFont font2("Arial", 12);
font2.setBold(true); // 太字に設定
QLabel *label2 = new QLabel("これは太字のフォントです。", &window);
label2->setFont(font2);
layout->addWidget(label2);
qDebug() << "Font 2 is bold:" << font2.bold(); // true を出力
window.setWindowTitle("QFont::bold() の例");
window.show();
return app.exec();
}
QFont::bold() は true を返すが、実際には太字で表示されない
これは最もよくある問題です。
QFont::bold()
がtrue
を返したとしても、それが必ずしも画面上で太字としてレンダリングされることを保証するわけではありません。
原因
- Qtバージョンの違い (特にmacOS)
- 古いQtバージョン(例: Qt 4.8.x)では、macOS上でリソースからフォントをロードする際に、特に太字スタイルが正しく認識されないバグが存在したことがあります。この場合、フォントファミリー名にスタイル名(例: "Avenir LT Com 95 Black")を含めることで解決する場合がありますが、これは特定のQtバージョンとOSの組み合わせに依存します。
- Qtのフォントマッチングの挙動
- Qtは、要求されたフォントの属性(ファミリー、サイズ、ウェイトなど)に最も近いフォントをシステムから選択します。太字のフォントが見つからない場合、最も近いウェイトのフォント(通常ウェイトなど)が選択されることがあります。
- フォントが太字をサポートしていない
- すべてのフォントファミリーが太字のスタイルを持っているわけではありません。特に一部のカスタムフォントやモノスペースフォントでは、太字スタイルが提供されていない場合があります。
- フォントファイルが存在しない/読み込まれていない
- 指定したフォントファミリー(例: "Arial")の太字バージョン(
Arial Bold.ttf
など)がシステムにインストールされていない、またはアプリケーションのリソースから正しく読み込まれていない場合、Qtは代替フォントまたは通常のウェイトのフォントで表示しようとします。
- 指定したフォントファミリー(例: "Arial")の太字バージョン(
トラブルシューティング
- スタイルシートの確認
- ウィジェットにQtスタイルシート(QSS)が適用されている場合、それがフォント設定を上書きしている可能性があります。QSSで
font-weight: bold;
が設定されているか確認します。
- ウィジェットにQtスタイルシート(QSS)が適用されている場合、それがフォント設定を上書きしている可能性があります。QSSで
- Qtのバージョンを更新する
- 古いQtバージョンを使用している場合は、最新バージョンに更新することで問題が解決する可能性があります。
- フォントファミリー名を正確に指定する
- フォント名が正確であるか(大文字・小文字、スペースなど)確認します。一部のフォントでは、太字スタイルにアクセスするために、より具体的なファミリー名が必要な場合があります。
- カスタムフォントのロードを確認する
QFontDatabase::addApplicationFont()
などを使用してアプリケーション内でカスタムフォントをロードしている場合、太字バージョンのフォントファイルも正しくロードされていることを確認します。
- システムにフォントがインストールされているか確認する
- 使用したいフォントの太字バージョンが、アプリケーションを実行しているシステムに実際にインストールされていることを確認します。
- QFontInfoを使用する
- 実際にレンダリングされるフォントの情報を取得するには、
QFontInfo
クラスを使用します。 QFontInfo info(myLabel->font());
のようにしてQFontInfo
オブジェクトを作成し、info.bold()
やinfo.weight()
、info.family()
などを確認することで、実際にどのフォントが、どのウェイトで使われているかを知ることができます。これにより、問題がフォントの存在自体にあるのか、Qtのマッチングにあるのかを特定できます。
- 実際にレンダリングされるフォントの情報を取得するには、
setBold(true) を呼び出しても QFont::bold() が false を返す
これは比較的稀ですが、あり得ます。
原因
- QFontオブジェクトのコピー
QFont
は値型オブジェクトであり、代入や関数の引数として渡されるとコピーされます。もし、異なるQFont
オブジェクトに対してsetBold(true)
を呼び出し、別のQFont
オブジェクトに対してbold()
を呼び出している場合、期待する結果が得られないことがあります。- 例:
QFont myFont = label->font(); myFont.setBold(true);
とした場合、myFont
は変更されますが、label
に設定されている元のフォントは変更されません。label->setFont(myFont);
のように、変更したmyFont
を再度ウィジェットに設定する必要があります。
トラブルシューティング
- ウィジェットのフォントを変更する場合は、
widget->setFont(fontObject);
のように、変更後のQFont
オブジェクトをウィジェットに再設定するのを忘れないようにします。 setBold()
を呼び出したQFont
オブジェクトと、bold()
を呼び出しているQFont
オブジェクトが同一であることを確認します。
QFont::bold()
自体がコンパイルエラーを引き起こすことはほとんどありませんが、QFont
の他の関数との組み合わせで発生する可能性があります。
原因
- ポインタの間違った使用
QFont* fontPtr;
のようなポインタでQFont
を扱っている場合、fontPtr.bold()
のようにドット演算子を使用するとエラーになります。正しいアクセスはfontPtr->bold()
です。
- Qt 6以降では、
QFont::setWeight()
の引数の型がint
からQFont::Weight
列挙型に変更されています。古いコードを移植する場合、setWeight(75)
のようなコードがコンパイルエラーになる可能性があります。この場合、setWeight(QFont::Bold)
のように変更するか、setLegacyWeight(75)
を使用します。ただし、QFont::bold()
はQFont::Normal
より大きなウェイト値かどうかをチェックするだけなので、直接影響は少ないです。 - ポインタを使用している場合は、
->
演算子を使用しているか確認します。
例1: 基本的な使用法 - 太字の状態を確認する
この例では、QFont
オブジェクトが太字に設定されているかどうかをQFont::bold()
を使って確認します。
#include <QApplication>
#include <QFont>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug> // デバッグ出力用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
// 1. 通常のフォントを作成
QFont normalFont("Arial", 14);
QLabel *label1 = new QLabel("これは通常のフォントです。", &window);
label1->setFont(normalFont);
layout->addWidget(label1);
// QFont::bold() で太字の状態を確認
qDebug() << "Normal Font is bold:" << normalFont.bold(); // 出力: Normal Font is bold: false
// 2. 太字のフォントを作成
QFont boldFont("Arial", 14);
boldFont.setBold(true); // 太字に設定
QLabel *label2 = new QLabel("これは太字のフォントです。", &window);
label2->setFont(boldFont);
layout->addWidget(label2);
// QFont::bold() で太字の状態を確認
qDebug() << "Bold Font is bold:" << boldFont.bold(); // 出力: Bold Font is bold: true
// 3. QFont::setWeight() で太字を設定した場合
QFont heavierFont("Times New Roman", 14);
heavierFont.setWeight(QFont::ExtraBold); // QFont::ExtraBold は QFont::Normal より重い
QLabel *label3 = new QLabel("これはさらに太いフォントです。", &window);
label3->setFont(heavierFont);
layout->addWidget(label3);
qDebug() << "Heavier Font is bold:" << heavierFont.bold(); // 出力: Heavier Font is bold: true (QFont::Normal より重いため)
window.setWindowTitle("QFont::bold() 基本の例");
window.show();
return app.exec();
}
解説
heavierFont
はsetWeight(QFont::ExtraBold)
で太さを設定しています。QFont::bold()
は、フォントのウェイトがQFont::Normal
よりも大きい場合にtrue
を返すため、これもtrue
となります。boldFont
はsetBold(true)
を呼び出しているため、bold()
はtrue
を返します。normalFont
はsetBold(true)
を呼び出していないため、bold()
はfalse
を返します。
例2: ボタンクリックでフォントの太字を切り替える
この例では、ボタンがクリックされるたびにラベルのフォントの太字状態を切り替えます。
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QFont>
#include <QDebug>
class FontToggleWidget : public QWidget
{
Q_OBJECT // シグナル/スロットを使用するために必要
public:
FontToggleWidget(QWidget *parent = nullptr) : QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout(this);
label = new QLabel("このテキストの太字を切り替えます。", this);
QFont initialFont("Meiryo UI", 16); // 例としてMeiryo UIを使用
label->setFont(initialFont);
layout->addWidget(label);
toggleButton = new QPushButton("太字を切り替える", this);
layout->addWidget(toggleButton);
// ボタンのクリックシグナルをスロットに接続
connect(toggleButton, &QPushButton::clicked, this, &FontToggleWidget::toggleFontBold);
// 初期状態の表示
updateLabelFont();
}
private slots:
void toggleFontBold()
{
QFont currentFont = label->font(); // 現在のフォントを取得
bool isBold = currentFont.bold(); // 現在の太字状態を確認
// 太字の状態を反転させて設定
currentFont.setBold(!isBold);
label->setFont(currentFont); // 変更したフォントをラベルに再設定
updateLabelFont(); // ボタンのテキストとデバッグ表示を更新
}
void updateLabelFont()
{
QFont currentFont = label->font();
// QFontInfo を使用して、実際に表示されるフォントの情報を確認
QFontInfo fontInfo(currentFont);
if (fontInfo.bold()) {
toggleButton->setText("太字をオフにする (現在: 太字)");
qDebug() << "現在のフォント: 太字 (QFont::bold() = " << currentFont.bold() << ", QFontInfo::bold() = " << fontInfo.bold() << ")";
} else {
toggleButton->setText("太字をオンにする (現在: 通常)");
qDebug() << "現在のフォント: 通常 (QFont::bold() = " << currentFont.bold() << ", QFontInfo::bold() = " << fontInfo.bold() << ")";
}
qDebug() << " 実際のリゾルブされたフォントファミリー:" << fontInfo.family();
qDebug() << " 実際のリゾルブされたフォントウェイト:" << fontInfo.weight();
}
private:
QLabel *label;
QPushButton *toggleButton;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FontToggleWidget window;
window.setWindowTitle("太字切り替えの例");
window.resize(400, 150);
window.show();
return app.exec();
}
#include "main.moc" // mocファイルをインクルード(Q_OBJECTを使用する場合)
解説
updateLabelFont()
では、QFontInfo
を使って実際に適用されているフォントの情報をデバッグ出力しています。これにより、QFont::bold()
がtrue
なのに見た目が太字にならない場合に、フォントのロードやマッチングの問題を診断できます。- 重要
変更したQFont
オブジェクトをlabel->setFont(currentFont);
でラベルに再設定することを忘れないでください。QFont
は値型なので、コピーに対して変更しても元のフォントは変わりません。 currentFont.bold()
で現在の太字状態を確認し、その逆の値をcurrentFont.setBold()
に渡して太字状態を切り替えます。toggleFontBold()
スロットでは、まずlabel->font()
で現在のフォントを取得します。
QFont::bold()
がtrue
を返すのに、UI上でフォントが太字に見えない場合によくある問題のトラブルシューティング例です。
#include <QApplication>
#include <QFont>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QFontInfo> // QFontInfo を使用
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
// 存在しないフォント名を指定して太字に設定してみる
QFont customFont("NonExistentFontFamily", 20); // 存在しないフォント
customFont.setBold(true); // 太字に設定
QLabel *label = new QLabel("このテキストは太字になるはずですが…", &window);
label->setFont(customFont);
layout->addWidget(label);
// QFontオブジェクトの設定状態を確認
qDebug() << "QFont::bold() (設定):" << customFont.bold(); // おそらく true を出力
// QFontInfo を使って、実際に使われているフォントの情報を確認
QFontInfo fontInfo(label->font()); // label->font() で実際に設定されたフォントを取得
qDebug() << "--- QFontInfo による実際のフォント情報 ---";
qDebug() << " 実際に使用されているフォントファミリー:" << fontInfo.family();
qDebug() << " 実際に太字か (QFontInfo::bold()):" << fontInfo.bold(); // これが重要
qDebug() << " 実際のフォントウェイト:" << fontInfo.weight();
qDebug() << " フォントが指定されたファミリーか:" << fontInfo.realFont().family();
qDebug() << "------------------------------------------";
// フォントが期待通りに太字になっていない場合のメッセージ
if (customFont.bold() && !fontInfo.bold()) {
qDebug() << "警告: QFont::bold() は true ですが、QFontInfo::bold() は false です。";
qDebug() << " これは、指定したフォントファミリーに太字スタイルがないか、";
qDebug() << " システムに太字フォントがインストールされていない可能性が高いです。";
}
window.setWindowTitle("QFontInfo によるデバッグの例");
window.resize(500, 200);
window.show();
return app.exec();
}
- この例では、存在しないフォントを指定して太字に設定することで、
QFont::bold()
はtrue
を返すのにQFontInfo::bold()
がfalse
を返す状況をシミュレートしています。これにより、問題がフォントの存在や互換性にあることを特定できます。 QFontInfo
は、QFont
オブジェクトを実際に画面にレンダリングする際にQtが選択したフォントに関する情報を提供します。- しかし、実際に表示されるフォントの太字状態は、システムにインストールされているフォントに依存します。
QFont::bold()
は、QtがQFont
オブジェクトに設定した太字の状態を返します。
QFont::setWeight() と QFont::weight() の使用
QFont::setBold(bool)
は内部的にsetWeight()
を呼び出しており、bold()
はweight()
の値を基に判断しています。したがって、太字を明示的に設定するだけでなく、より詳細なフォントの太さを制御したい場合にsetWeight()
とweight()
が役立ちます。
QFont::weight() const
: 現在のフォントのウェイトをQFont::Weight
列挙値として返します。QFont::setWeight(QFont::Weight weight)
: フォントのウェイトを数値で設定します。QFont::Weight
は、Thin
(0) からBlack
(100) までの様々な定義済みウェイトを提供します。QFont::Normal
(50) は通常ウェイトです。QFont::Bold
(75) は太字ウェイトです。QFont::DemiBold
(63)、QFont::ExtraBold
(81)、QFont::Light
(25) など、より多くの選択肢があります。
例
#include <QApplication>
#include <QFont>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
// QFont::setWeight() で太字を設定
QFont font1("Arial", 16);
font1.setWeight(QFont::Bold); // QFont::Bold は QFont::setBold(true) と同等
QLabel *label1 = new QLabel("このテキストは QFont::Bold です。", &window);
label1->setFont(font1);
layout->addWidget(label1);
qDebug() << "Font1 weight:" << font1.weight() << ", bold:" << font1.bold();
// QFont::ExtraBold でさらに太く
QFont font2("Arial", 16);
font2.setWeight(QFont::ExtraBold);
QLabel *label2 = new QLabel("このテキストは QFont::ExtraBold です。", &window);
label2->setFont(font2);
layout->addWidget(label2);
qDebug() << "Font2 weight:" << font2.weight() << ", bold:" << font2.bold();
// QFont::Light で細く
QFont font3("Arial", 16);
font3.setWeight(QFont::Light);
QLabel *label3 = new QLabel("このテキストは QFont::Light です。", &window);
label3->setFont(font3);
layout->addWidget(label3);
qDebug() << "Font3 weight:" << font3.weight() << ", bold:" << font3.bold(); // QFont::Normal より軽いため false
window.setWindowTitle("QFont::setWeight() の例");
window.show();
return app.exec();
}
利点
- フォントデザイナーが提供する特定のウェイト(例: セミボールド、ライト)を正確に指定できます。
setBold()
よりも細かくフォントの太さを制御できるため、より多様なデザイン要件に対応できます。
Qtスタイルシート (QSS) の使用
UIのスタイルをコードから分離し、CSSライクな構文でフォントプロパティを設定する方法です。特にデザインの一貫性やテーマの適用に非常に有効です。
font-weight
プロパティ: CSSのfont-weight
プロパティと同様に、太さを設定できます。bold
(数値の700に相当)normal
(数値の400に相当)lighter
,bolder
100
,200
, ...,900
などの数値ウェイト(QFont::Thin
からQFont::Black
に対応)
例
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QLabel *label1 = new QLabel("通常フォント", &window);
label1->setFont(QFont("Arial", 16));
layout->addWidget(label1);
QLabel *label2 = new QLabel("スタイルシートで太字", &window);
// スタイルシートでフォントサイズと太字を設定
label2->setStyleSheet("QLabel { font-family: Arial; font-size: 16pt; font-weight: bold; }");
layout->addWidget(label2);
QLabel *label3 = new QLabel("スタイルシートでExtraBold", &window);
// 数値でより具体的なウェイトを指定
label3->setStyleSheet("QLabel { font-family: Arial; font-size: 16pt; font-weight: 800; }"); // 800は ExtraBold に近い
layout->addWidget(label3);
window.setWindowTitle("Qtスタイルシートの例");
window.show();
return app.exec();
}
利点
- UIデザイナーがCSSの知識を活用してフォントスタイルを調整できます。
- アプリケーション全体のスタイルを簡単に変更できます。
- UIのデザインとロジックを分離できるため、コードが読みやすくなります。
QFont::bold()
はQFont
オブジェクトが太字であると設定されているかを返しますが、実際にシステムに太字フォントが存在し、それが利用可能であるかを直接示すものではありません。
フォントが本当に利用可能か、どのスタイルが利用可能かを確認したい場合は、QFontDatabase
を使用します。
QFontDatabase::has Font(const QString &family)
: 指定されたフォントファミリーが利用可能かを確認します。QFontDatabase::weight(const QString &family, const QString &style)
: 指定されたフォントファミリーとスタイルのウェイトを返します。QFontDatabase::styles(const QString &family)
: 指定されたフォントファミリーが持つすべてのスタイル名(例: "Regular", "Bold", "Italic"など)のリストを返します。
例
#include <QApplication>
#include <QFont>
#include <QLabel>
#include <QVBoxLayout>
#include <QWidget>
#include <QDebug>
#include <QFontDatabase> // QFontDatabase を使用
int main(int argc, char *argv[])
{
QApplication app(argc);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QString targetFontFamily = "Arial"; // 存在すると仮定
// QString targetFontFamily = "NonExistentFont"; // 存在しない場合をシミュレート
qDebug() << "--- フォントの可用性チェック ---";
if (QFontDatabase::hasFont(targetFontFamily)) {
qDebug() << targetFontFamily << "フォントは利用可能です。";
QStringList styles = QFontDatabase::styles(targetFontFamily);
qDebug() << "利用可能なスタイル:" << styles.join(", ");
if (styles.contains("Bold", Qt::CaseInsensitive)) { // "Bold"スタイルがあるかチェック
qDebug() << targetFontFamily << "フォントはBoldスタイルをサポートしています。";
QFont font(targetFontFamily, 16);
font.setBold(true);
QLabel *label = new QLabel(targetFontFamily + " - Bold (利用可能)", &window);
label->setFont(font);
layout->addWidget(label);
} else {
qDebug() << targetFontFamily << "フォントはBoldスタイルをサポートしていません。";
QFont font(targetFontFamily, 16);
font.setBold(true); // 太字設定はするが、適用されない可能性
QLabel *label = new QLabel(targetFontFamily + " - Bold (非サポート)", &window);
label->setFont(font);
layout->addWidget(label);
}
} else {
qDebug() << targetFontFamily << "フォントは利用できません。";
QFont font("Sans-serif", 16); // 代替フォントを使用
font.setBold(true);
QLabel *label = new QLabel(targetFontFamily + " - フォントがありません (代替)", &window);
label->setFont(font);
layout->addWidget(label);
}
window.setWindowTitle("QFontDatabase の例");
window.show();
return app.exec();
}
利点
- これにより、ユーザー環境に依存するフォント表示の問題を事前に予測し、適切なフォールバック処理を提供できます。
- フォントが実際に利用可能か、どのスタイルがサポートされているかをアプリケーションの起動時に確認できます。
QFont::bold()
はフォントの太字状態を確認する基本的なメソッドですが、より複雑なフォントの太さの制御や、フォントの可用性に関する堅牢なプログラミングを行うためには、上記のような代替または補完的な方法を理解し、活用することが重要です。
- フォントの可用性確認:
QFontDatabase
- デザインとロジックの分離: Qtスタイルシート (
font-weight
) - 細かいウェイト制御:
QFont::setWeight()
/QFont::weight()