QFont::underline()

2025-06-06

具体的には以下の2つの使い方があります。

  1. 下線の設定 (setter)
    void QFont::setUnderline(bool enable): この関数は、フォントに下線を引くかどうかを設定します。

    • enabletrueの場合、そのフォントで描画されるテキストには下線が引かれます。
    • enablefalseの場合、下線は引かれません(デフォルトの状態)。
    QFont font;
    font.setUnderline(true); // フォントに下線を引く
    QLabel *label = new QLabel("このテキストには下線が引かれます");
    label->setFont(font);
    
  2. 下線の状態の取得 (getter)
    bool QFont::underline() const この関数は、現在そのフォントに下線が設定されているかどうかを返します。

    • 下線が設定されていればtrueを返します。
    • 設定されていなければfalseを返します。

    使用例

    QFont font;
    font.setUnderline(true);
    
    if (font.underline()) {
        qDebug() << "下線が設定されています。";
    } else {
        qDebug() << "下線は設定されていません。";
    }
    

注意点

  • 下線のスタイル(点線、二重線など)を変更したい場合は、QFontクラスだけでは直接制御できません。 richerなテキスト表現が必要な場合は、QTextCharFormatなどを利用して、より詳細な書式設定を行う必要があります。


下線が表示されない、または期待通りに表示されない

エラー/現象

  • 下線が文字に重なって表示される、または不自然な位置に表示される。
  • setFontUnderline(true)を設定しても、テキストに下線が引かれない。

原因とトラブルシューティング

  • QPainterの使用方法

    • QPainterで直接テキストを描画している場合、QPainter::setFont()で適切に設定されたQFontが渡されているか確認してください。
    • 対策
      painter->setFont(myFont); のように、QFontオブジェクトがコピーされる形で渡されていることを確認します。ポインタ渡しなどで意図しない変更が行われている可能性があります。
  • スタイルシート (Qt Style Sheets) による上書き

    • ウィジェットにスタイルシートを適用している場合、スタイルシートがQFontの設定を上書きしてしまうことがあります。
    • 対策
      スタイルシートでtext-decoration: underline;のようなプロパティが設定されていないか確認してください。もし設定されている場合は、その設定がQFont::setUnderline()よりも優先される可能性があります。
    • QFontオブジェクトを作成する際に、存在しないフォントファミリーを指定している場合があります。その場合、システムが代替フォントを使用するため、下線が期待通りに描画されないことがあります。
    • 対策
      QFont::lastResortFamily()QFont::defaultFamily()などを使って、実際に使用されているフォントを確認するか、QFontDatabaseを使ってシステムにインストールされているフォントをリストアップし、正しいフォントファミリー名を指定しているか確認してください。また、カスタムフォントを使用している場合は、QFontDatabase::addApplicationFont()で正しく読み込まれているか確認が必要です。
  • QFont::underline()QFont::setUnderline()を使用するとコンパイルエラーが発生する。
  • constオブジェクトに対するsetUnderline()の呼び出し

    • setUnderline()はフォントの状態を変更するため、const修飾されたQFontオブジェクトに対しては呼び出すことができません。
    • 対策
      const QFont myFont; のようなconstオブジェクトではないことを確認してください。
  • 無効な引数、または関数のシグネチャの誤り

    • setUnderline()にはbool型の引数を渡す必要があります。他の型を渡すとコンパイルエラーになります。
    • 対策
      font.setUnderline(true);font.setUnderline(false); のように、trueまたはfalseを渡しているか確認してください。
  • ヘッダーファイルの不足

    • QFontクラスを使用するには、適切なヘッダーファイルを含める必要があります。
    • 対策
      コードの冒頭に#include <QFont>を含めているか確認してください。
  • QML/Qt Quickでのフォント問題
    • Qt WidgetsではなくQML/Qt Quickを使用している場合、フォントのレンダリングや下線の挙動は異なることがあります。QMLではText要素のtext-decorationプロパティを使用します。
    • 対策
      QMLのドキュメントを参照し、QMLにおけるフォントとテキストの装飾方法を適切に適用しているか確認してください。


基本的な下線の設定と取得

この例では、QLabelウィジェットのテキストに下線を設定し、その状態を確認する方法を示します。

#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();
    QVBoxLayout *layout = new QVBoxLayout(window);

    // 1. QFontオブジェクトを作成
    QFont font;

    // 2. フォントサイズを設定(見やすくするため)
    font.setPointSize(20);

    // 3. 下線を設定(trueで下線を引く)
    font.setUnderline(true);

    // 4. QLabelを作成し、フォントを適用
    QLabel *label1 = new QLabel("このテキストには下線が引かれます。");
    label1->setFont(font);
    layout->addWidget(label1);

    // 5. 下線の状態を取得してデバッグ出力
    qDebug() << "ラベル1の下線状態: " << font.underline(); // trueが出力されるはず

    // 別のQLabelで下線なしのフォントを使用
    QFont fontNoUnderline = font; // fontから設定をコピー
    fontNoUnderline.setUnderline(false); // 下線を解除

    QLabel *label2 = new QLabel("このテキストには下線がありません。");
    label2->setFont(fontNoUnderline);
    layout->addWidget(label2);

    qDebug() << "ラベル2の下線状態: " << fontNoUnderline.underline(); // falseが出力されるはず

    window->setWindowTitle("QFont::underline() の例");
    window->show();

    return app.exec();
}

解説

  • underline()メソッドを使って、現在のフォントオブジェクトに下線が設定されているかどうかの状態を取得し、デバッグ出力で確認しています。
  • QLabelにそのフォントを適用することで、テキストに下線が引かれます。
  • QFontオブジェクトを作成し、setUnderline(true)で下線を有効にしています。

QPushButtonのテキストにもQFont::underline()を適用できます。

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

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

    QWidget *window = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(window);

    QPushButton *button = new QPushButton("下線付きのボタン");

    QFont buttonFont = button->font(); // 現在のボタンのフォントを取得
    buttonFont.setUnderline(true);     // 下線を設定
    buttonFont.setPointSize(15);       // サイズも少し大きくする

    button->setFont(buttonFont); // ボタンに新しいフォントを適用

    layout->addWidget(button);

    window->setWindowTitle("QPushButtonと下線");
    window->show();

    return app.exec();
}

解説

  • QPushButtonの既存のフォント設定を取得し、それに下線を追加して再設定しています。これにより、ボタンの他のフォント設定(フォントファミリー、太さなど)を維持しつつ、下線のみを追加できます。

QFont::underline()はシンプルな下線に有効ですが、より複雑なテキスト編集(太字、斜体、色、異なる下線スタイルなど)を扱う場合は、QTextCharFormatを使用することが一般的です。これはQFont::underline()の直接的な使用例ではありませんが、関連する概念として重要です。

#include <QApplication>
#include <QTextEdit>
#include <QTextCharFormat>
#include <QFont>
#include <QVBoxLayout>
#include <QWidget>

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

    QWidget *window = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(window);

    QTextEdit *textEdit = new QTextEdit();
    textEdit->setPlainText("これは通常のテキストです。\n一部のテキストに下線を適用します。\n別のスタイルの下線も可能です。");

    // テキストの一部に下線を適用
    QTextCharFormat format;
    format.setFontUnderline(true); // QFont::underline() と同様の機能
    format.setUnderlineStyle(QTextCharFormat::SingleUnderline); // 単一の下線スタイル

    // カーソルを移動してテキストを選択し、書式を適用
    QTextCursor cursor = textEdit->textCursor();
    cursor.movePosition(QTextCursor::StartOfLine); // 最初の行の先頭
    cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 1); // 2行目に移動
    cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 2行目を選択

    cursor.mergeCharFormat(format); // 選択範囲に書式を適用

    // 別のスタイルの下線
    QTextCharFormat dottedFormat;
    dottedFormat.setFontUnderline(true);
    dottedFormat.setUnderlineStyle(QTextCharFormat::DotLine); // 点線の下線

    cursor = textEdit->textCursor();
    cursor.movePosition(QTextCursor::StartOfLine);
    cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 2); // 3行目に移動
    cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 3行目を選択

    cursor.mergeCharFormat(dottedFormat);

    layout->addWidget(textEdit);

    window->setWindowTitle("QTextEditと下線");
    window->show();

    return app.exec();
}
  • QTextCharFormat::setFontUnderline(true)QFont::setUnderline(true)と似た効果を持ちますが、setUnderlineStyle()で下線の種類(単線、点線、破線など)をより詳細に制御できます。
  • QTextEditのようなリッチテキストエディタでは、QTextCharFormatを使用して個々の文字や文字列の書式を設定します。


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

Qtスタイルシートは、CSSのような構文でウィジェットの外観をカスタマイズするための強力なメカニズムです。テキストの下線もスタイルシートで制御できます。これは、アプリケーション全体または特定のウィジェットのスタイルを一元的に管理したい場合に非常に便利です。

方法

text-decorationプロパティをunderlineに設定します。

コード例

#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("スタイルシートで下線付きのラベル");
    // QLabelに直接スタイルシートを適用
    label1->setStyleSheet("text-decoration: underline; font-size: 20px;");
    layout->addWidget(label1);

    QPushButton *button1 = new QPushButton("スタイルシートで下線付きのボタン");
    // QPushButtonにスタイルシートを適用
    button1->setStyleSheet("text-decoration: underline; font-size: 15px;");
    layout->addWidget(button1);

    // 特定のオブジェクト名を持つウィジェットにスタイルシートを適用することも可能
    QLabel *label2 = new QLabel("オブジェクト名で下線付きのラベル");
    label2->setObjectName("underlinedLabel"); // オブジェクト名を設定
    layout->addWidget(label2);

    // アプリケーション全体にスタイルシートを適用
    // (ここではオブジェクト名が"underlinedLabel"のQLabelに適用)
    app.setStyleSheet("QLabel#underlinedLabel { text-decoration: underline; font-size: 18px; color: blue; }");


    window->setWindowTitle("Qtスタイルシートによる下線");
    window->show();

    return app.exec();
}

メリット

  • カスケード
    親から子へ、より具体的な設定が優先されるCSSのカスケードの概念が適用されます。
  • 分離
    UIの見た目とロジックを分離できます。
  • 柔軟性
    アプリケーションのテーマ設定や動的なスタイルの変更に非常に適しています。

デメリット

  • 細かい制御の限界
    text-decorationプロパティでは、下線のスタイル(点線、二重線など)は制御できません。
  • 学習曲線
    CSSの知識が必要です。
  • オーバーヘッド
    非常に多くのウィジェットに複雑なスタイルシートを適用すると、パフォーマンスに影響を与える可能性があります(ただし、通常は無視できるレベル)。

リッチテキスト/HTMLタグの利用 (特に QTextEdit, QTextBrowser, QLabelの一部)

QTextEditQTextBrowserなどのリッチテキストを扱うウィジェット、また、HTML形式のテキストを表示できるQLabelでは、テキスト自体にHTMLタグを埋め込むことで下線を表示できます。

HTMLの<u>タグ(underline)を使用します。

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

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

    QWidget *window = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(window);

    // QTextEditでのHTML利用
    QTextEdit *textEdit = new QTextEdit();
    textEdit->setHtml("これは<u>HTMLタグで下線が引かれた</u>テキストです。<br>"
                      "<b>太字</b>や<i>斜体</i>と組み合わせることもできます。");
    layout->addWidget(textEdit);

    // QLabelでのHTML利用(setTextFormat(Qt::RichText)が必要な場合あり、
    // またはデフォルトでRichText対応している場合)
    QLabel *label = new QLabel();
    label->setTextFormat(Qt::RichText); // QLabelでHTMLを解釈させる
    label->setText("<u>HTMLタグで下線付きのラベル</u>");
    layout->addWidget(label);

    window->setWindowTitle("HTMLタグによる下線");
    window->show();

    return app.exec();
}
  • 簡単
    HTMLの知識があれば簡単に実装できます。
  • 柔軟性
    テキストの特定の部分にのみ下線を適用したり、他のHTMLタグと組み合わせて複雑なテキスト表現を行ったりできます。
  • QTextCharFormatより劣る制御
    QTextCharFormat(後述)と比較すると、下線のスタイルなどをプログラム的に細かく制御するのは難しいです。
  • QTextEdit/QTextBrowser以外での利用
    QLabelでHTMLを使用する場合、setTextFormat(Qt::RichText)を明示的に設定する必要がある場合があります。また、すべてのウィジェットがHTMLを解釈できるわけではありません。
  • セキュリティ
    信頼できないHTMLを入力として受け入れる場合、XSSなどのセキュリティリスクが発生する可能性があります(通常はユーザーからの入力をそのまま表示しない限り問題ありません)。

これはQFont::underline()と機能的には似ていますが、QTextEditQTextBrowserなどのリッチテキストを扱うウィジェットで、テキストの一部にプログラム的に書式設定を適用する際に使用されるより高レベルなAPIです。QFontはフォント全体の属性を管理するのに対し、QTextCharFormatは文字レベルでの詳細な書式(下線スタイル、背景色、文字色など)を管理します。

QTextCharFormatオブジェクトを作成し、setFontUnderline(true)およびsetUnderlineStyle()で下線のスタイルを設定し、これをQTextCursorを使ってテキストに適用します。

#include <QApplication>
#include <QTextEdit>
#include <QTextCharFormat>
#include <QTextCursor>
#include <QVBoxLayout>
#include <QWidget>

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

    QWidget *window = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout(window);

    QTextEdit *textEdit = new QTextEdit();
    textEdit->setPlainText("このテキストの一部に、プログラムで下線を適用します。\n"
                           "異なる下線スタイル(点線など)も試してみましょう。");

    // 最初の行の一部に単一の下線を適用
    QTextCharFormat singleUnderlineFormat;
    singleUnderlineFormat.setFontUnderline(true);
    singleUnderlineFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline); // 単一の下線

    QTextCursor cursor = textEdit->textCursor();
    cursor.movePosition(QTextCursor::Start); // テキストの先頭に移動
    cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 13); // "このテキストの"
    cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, 4);  // "一部"を選択
    cursor.mergeCharFormat(singleUnderlineFormat); // 書式を適用

    // 2行目のテキストに点線の下線を適用
    QTextCharFormat dottedUnderlineFormat;
    dottedUnderlineFormat.setFontUnderline(true);
    dottedUnderlineFormat.setUnderlineStyle(QTextCharFormat::DotLine); // 点線の下線
    dottedUnderlineFormat.setFontWeight(QFont::Bold); // 下線と一緒に太字も適用

    cursor = textEdit->textCursor(); // カーソルをリセット
    cursor.movePosition(QTextCursor::StartOfLine); // 最初の行の先頭
    cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, 1); // 2行目に移動
    cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor); // 2行目全体を選択

    cursor.mergeCharFormat(dottedUnderlineFormat);

    layout->addWidget(textEdit);

    window->setWindowTitle("QTextCharFormatによる下線");
    window->show();

    return app.exec();
}
  • リッチテキスト対応
    QTextEditなどのリッチテキストウィジェットで、ユーザーインターフェースを介さずにテキストを装飾するのに最適です。
  • 詳細な制御
    下線のスタイル(点線、破線、二重線など)、色、太さなど、非常に詳細なテキスト書式をプログラム的に制御できます。
  • ウィジェットの限定
    主にQTextEditQTextBrowserなどのリッチテキスト表示/編集ウィジェットでの使用を意図しています。
  • 複雑さ
    QTextCursorを操作する必要があるため、単純な下線設定よりもコードが複雑になります。
  • QTextCharFormat
    QTextEditなどで、テキストの一部に非常に詳細な書式(下線スタイル、色など)をプログラム的に適用したい場合に最適です。
  • HTMLタグ
    QTextEditQLabelなどで、簡易的なリッチテキスト表現が必要な場合に手軽です。
  • Qtスタイルシート
    アプリケーションのルック&フィールを一元的に管理したい場合や、デザインとコードを分離したい場合に強力な選択肢です。
  • QFont::underline()
    最もシンプルで基本的な方法。ウィジェット全体のテキストに一律に下線を適用したい場合に適しています。